Linux-Shell(三)

  • Shell格式
1、擴展名: xxx.sh
2、正文第一行必須指定解釋器: #!/bin/bash
  • shell執行方式
# 方式一: 加權限,  ./xxx.sh 執行
1、chmod +x  xxx.sh
2、./xxx.sh

# 方式二: 手動指定解釋器
bash xxx.sh
  • 自定義變量
# 1. 定義變量
變量名=值    ---->  注意: =兩側絕對不能有空格
eg1: name="take me to your heart"

# 2. 調用變量的格式
echo $變量名

# 01_variable_1.sh
name="風云雄霸天下"
echo $name
     
# 3. 小細節: 單引號和雙引號的區別
單引號: 無法獲取變量的值
雙引號: 可以獲取變量的值
  • 環境變量+位置變量+預設變量
# 環境變量
echo $USER   --  當前用戶
echo $UID    --  當前用戶的UID號
echo $PWD    --  當前路徑
echo $PATH   --  命令搜索路徑

# 位置變量
$1 $2 $3 ... ... shell的位置變量

# 預定義變量
$# $* $?

# $? : 返回上一條命令執行的狀態(0代表正確,非0代表失敗)

練習

輸出$1+$2,例如輸出結果: 3+5
#!/bin/bash
echo $1+$2
  • 變量賦值 - 接收用戶從終端輸入的值
# 語法格式
read -p 提示信息 變量名

# 05_read.sh
#!/bin/bash
read -p 請輸入姓名: name
echo "您輸入的姓名是:$name"

# 指定超時時間
read -p 提示信息 變量名
read -t n -p 提示信息 變量名

# 06_read_t.sh 限制3秒中之內必須輸入值
#!/bin/bash
read -t 3 -p 請輸入用戶名: username

練習

1、輸入學生姓名: 趙敏
2、輸入學生成績: 88
3、輸出: 趙敏的成績為88分

Ubuntu設置sudo免密碼

# 通過更改 /etc/sudoers 實現
1、備份: sudo cp /etc/sudoers .
2、修改: sudo vi /etc/sudoers
   添加: tarena ALL=(ALL) NOPASSWD : ALL

練習

請使用位置變量的方式實現用戶名的創建
#!/bin/bash
sudo useradd $1
echo "$1創建成功"
運行: ./文件名   用戶名
# 創建用戶名: useradd 用戶名
# 刪除用戶名:userdel 用戶名
  • shell - 算術運算符
# 運算符
1、+ - * / % 
2、++ : 自加1運算,類似于python中  i+=1
3、-- : 同++
            
# 運算命令
1、let 運算表達式
    i=1
    let i++
    echo $i
2、expr 運算表達式
    i=1
    sum=`expr $i + 5` # +兩側要有空格
    echo $sum
3、$[]
    echo $[1+1]
    echo $[1-1]
    echo $[a+a] # 調用變量不用多次添加$符號
    echo $[1*1] # 乘法無需轉義

練習

使用 位置變量+以上方法一、二中任何一種,實現2個數字的相加
#!/bin/bash
echo $[$1+$2]
echo `expr $1 + $2`
  • shell - 比較運算符
# 語法格式
 [  判斷語句  ]      # 注意括號必須有空格
# 組合
&& 并且
|| 或者
A命令  &&  B命令   //僅當A成功時才執行B
A命令  ||  B命令   //僅當A失敗時才執行B
思考: [ a == a ] && echo Y || echo N 代表什么意思?
#Y

# 1、字符比較
[ A == A ]    #相等(等號兩邊需要有空格)
[ A != B ]    #不相等
[ -z $變量 ]  #判斷是否為空
思考(Y 還是 N):  [ $USER == tarena ] && echo Y || echo N

練習: 用戶輸入用戶名,判斷是否為空,不為空時創建,否則直接退出程序
#!/bin/bash
read -p "請輸入用戶名:" username
[ -z $username ] && exit
sudo useradd $username

# 2、數字比較
    -eq 等于(equal)
    -ne 不等于(not equal)
    -gt 大于(greater than)
    -ge 大于等于(great or equal)
    -lt 小于(less than)
    -le 小于等于(less or equal)
思考輸出什么:
[ 10 -eq 10 ] && echo Y || echo N   #Y
[ 11 -le 10 ] && echo Y || echo N  #N
[ 12 -ge 3 ] && echo Y || echo N  #Y

# 3、文件|目錄比較
   [ -e 文件或目錄 ]    #是否存在exist
   [ -f  文件      ]    #存在且為文件file
   [ -d  目錄      ]    #存在且為目錄directory
   [ -r 文件或目錄 ]    #判斷是否可讀read
   [ -w 文件或目錄 ]    #判斷是否可寫write
   [ -x 文件或目錄 ]    #判斷是否可執行
思考輸出:
    [ -e /etc/passwd ] && echo Y || echo N #Y
    [ -f /etc/passwd ] && echo Y || echo N #Y
    [ -d /etc/passwd ] && echo Y || echo N # N

if分支結構

# 1、單分支語法格式
     if 判斷 ;then
        命令
        命令
     fi
# 2、雙分支語法格式
    if 判斷 ;then
        命令1
    else
        命令2
    fi
# 3、多分支語法格式
  if 判斷;then
    命令1
  elif 判斷 ;then
    命令2
  else
    命令3
  fi
# 示例
#!/bin/bash
if [ $USER == tarena ];then
    echo "Yes,You are Tarena."
else
    echo "You are other man."

練習

使用shell編寫猜數字游戲,無須循環
# 計算機隨機出數字:computer=$RANDOM
#!/bin/bash
# 生成1-5直接的隨機數
num=$[RANDOM%5+1]
read -p "輸入你猜的數字:" num_input

echo $num
if [ $num -eq $num_input ];then
        echo "Well done!"
        exit
elif [ $num_input -lt $num ];then
        echo "Too small"

else
        echo "Too big"
fi

  • for循環
# 語法格式
for 變量 in 值序列
do
    命令
done
# 示例
for i in 1 2 3 4 5
do
    echo "hello world"
done
# 示例2: 1-8
for i in {1..8}
# 示例3: 執行Linux命令,獲取結果
for i in `Linux命令`
# 示例4: 造數 seq
seq 1 2 10 # 1 3 5 7 9    (起始值   步長   終止值)

造數

seq 1 2 10 # 1 3 5 7 9    (起始值   步長   終止值)
seq 3 8 #3 4 5 6 7 8

練習

把猜數字游戲改為for循環,猜測100次
#!/bin/bash

#把猜數字游戲改為for循環,猜測100次

computer=$[RANDOM%10000+1]

for i in {1..30}
do
        read -p "please guess:" guess
        if [ $computer -eq $guess ];then
                echo "Well done!"
                exit
        elif [ $computer -gt $guess ];then
                echo "Too small"
        else
                echo "Too big"
        fi
done


# 練習:判斷指定網段的IP地址哪些可以用,哪些不能用?
#!/bin/bash
online=0
down=0
for i in {2..254}
do
        ping -c 1 176.209.108.$i &> /dev/null #黑洞
        if [ $? -eq 0 ];then
                echo "176.209.108.$i onLine "
                let online++
        else
                echo "176.209.108.$i Down"
                let down++
        fi
echo "Online : $online"
echo "Down : $down"
done

mysql 設置遠程連接

1. 開啟遠程連接 - 服務端
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
將如下行注釋掉
# bind-address 127.0.0.1
sudo service mysql restart
2. 授權用戶
mysql -uroot -p123456
mysql > grant all privileges on *.*to 'tiger'@'%'

c-for 循環

for ((賦初值;條件;步長))
do 
 執行命令
 done
 # 示例 打印1-5 之間的整數
 for ((i=1;i<=5;i++))
 do
    echo $i
 done
  • while循環
# 語法格式
while 條件判斷
do
    命令
done

# 示例
#!/bin/bash
i=1
while [ $i -lt 5 ]
do
   echo $i
   let i++
done
# 死循環
while:
    do
    執行命令
    done
    # 示例:
    #!/bin/bash

# 簡陋的計時器
i=1
while :
do
    echo $i
    let i++
    sleep 1
    clear
done

文本處理工具-sed

# 1. 定義: 非交互式文本編輯器,逐行處理
# 2. 語法格式
sed [選項] '條件指令' 文件名
指令: 增刪改查
# 查詢   ->  p
sed -n 'p' 17_sed.txt # 打印所有內容
sed -n '1p' 17_sed.txt  #打印第1行內容
sed -n '1,3p' 17_sed.txt # 打印第1到3行內容
sed -n '1p;3p' 17_sed.txt # 打印1和3行內容
# 刪除   ->  d
sed -i '1d' 17_sed.txt  # 刪除第一行
sed -i '$d' 17_sed.txt  # 刪除最后一行
# 改  -> c
sed  -i  '1c內容' 17_sed.txt  #修改第1行
sed  -i  -e '1c李白' -e  '3c杜甫' 17_sed.txt #修改第1和第3行
# 增加  -> a     i
a : 在當前處理行的下一行插入
i: 在當前處理航的上一行插入
sed -i '1a李白' 17_sed.txt
# 替換 ->  s
sed -i '條件/原內容/新內容/選項' 文件名
選項: g 表示全局替換  i 忽略字母大小寫  
# 替換1到3行中的陶淵明
sed -i '1,3s/陶淵明/李白/' 17_sed.txt
# 替換每行中所有陶淵明,加g選項
sed -i '1,3s/陶淵明/李白/g' 17_sed.txt

練習

每隔1秒,從1個文件中隨機取1行,在大屏幕上顯示
# 1. 文件的行數,利用$RANDOM 想辦法取出隨機數
wc -l 17_sed.txt
sed -n '隨機數p' 
# 代碼實現:
#!/bin/bash

file="17_sed.txt"

number=$(sed -n '$=' $file)
while :
do
        clear
        l=$[RANDOM%number+1]
        sed -n "${l}p" $file
        sleep 1
done

文件|目錄判斷示例

/home/tarena/libai
判斷路徑是否存在
不存在:創建
已存在:不做操作
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 第 2 章 SHELL 基礎知識2.1 shell腳本我們在上面簡單介紹了一下什么是shell腳本,現在我們來進一...
    LiWei_9e4b閱讀 1,591評論 0 0
  • 官網 中文版本 好的網站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,438評論 0 5
  • 基礎命令 主要的命令和快捷鍵 Linux系統命令由三部分組成:cmd + [options]+[operation...
    485b1aca799e閱讀 1,119評論 0 0
  • 一、Python簡介和環境搭建以及pip的安裝 4課時實驗課主要內容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,803評論 0 10
  • 本文是對Linux shell編程的一個學習比較,共包括如下章節的內容: 概述 基本語法 結構化語句 函數 小結 ...
    我是老薛閱讀 844評論 0 5