1. 程式人生 > >shell基本使用教程

shell基本使用教程

文章目錄

shell基本使用教程

學習shell教程的筆記,以下為最基本的知識點。平時多看別人的shell程式。

shell變數

  • 定義和初始化 var=“variable”
    • 變數名和等號之間不能有空格
  • 使用變數 $var
  • 字串拼接 “This is “$var” bye!” -> This is variable bye
  • 獲取字串長度 ${#var}
  • 獲取子字串 ${var:1:3} -> aria

shell陣列

  • 定義 array_name=(value0 value1 value2 value3)
  • 使用 @ 符號可以獲取陣列中的所有元素 echo ${array_name[@]}
  • 陣列長度 length=${#array_name[@]}

傳遞引數

  • 在執行 Shell 指令碼時,向指令碼傳遞引數,指令碼內獲取引數的格式為:$n。n 代表一個數字,1 為執行指令碼的第一個引數,2 為執行指令碼的第二個引數,以此類推……
echo "Shell 傳遞引數例項!";
echo "執行的檔名:$0";
echo "第一個引數為:$1";
echo "第二個引數為:$2";
echo "第三個引數為:$3";

shell基本運算子

  • 算術運算
    注意點:=是賦值,==是判斷相等,乘號(*)前邊必須加反斜槓()才能實現乘法運算
  • 關係運算符
運算子 說明 舉例
-eq 檢測兩個數是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 檢測兩個數是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 檢測左邊的數是否大於右邊的,如果是,則返回 true。 [ $a -gt $b ] 返回 false。
-lt 檢測左邊的數是否小於右邊的,如果是,則返回 true。 [ $a -lt $b ] 返回 true。
-ge 檢測左邊的數是否大於等於右邊的,如果是,則返回 true。 [ $a -ge $b ] 返回 false。
-le 檢測左邊的數是否小於等於右邊的,如果是,則返回 true。 [ $a -le $b ] 返回 true。
  • 布林運算子

    • ! 非運算,表示式為 true 則返回 false,否則返回 true。 [ ! false ] 返回 true。
    • -o 或運算,有一個表示式為 true 則返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
    • -a 與運算,兩個表示式都為 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
  • 邏輯運算子 &&(與),||(或)

  • 字串運算子
    下表列出了常用的字串運算子,假定變數 a 為 “abc”,變數 b 為 “efg”:

運算子 說明 舉例
= 檢測兩個字串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 檢測兩個字串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 檢測字串長度是否為0,為0返回 true。 [ -z $a ] 返回 false。
-n 檢測字串長度是否為0,不為0返回 true。 [ -n “$a” ] 返回 true。
str 檢測字串是否為空,不為空返回 true。 [ $a ] 返回 true。
  • 檔案測試運算子

操作符 說明 舉例
-b file 檢測檔案是否是塊裝置檔案,如果是,則返回 true。 [ -b $file ] 返回 false。
-c file 檢測檔案是否是字元裝置檔案,如果是,則返回 true。 [ -c $file ] 返回 false。
-d file 檢測檔案是否是目錄,如果是,則返回 true。 [ -d $file ] 返回 false。
-f file 檢測檔案是否是普通檔案(既不是目錄,也不是裝置檔案),如果是,則返回 true。 [ -f $file ] 返回 true。
-g file 檢測檔案是否設定了 SGID 位,如果是,則返回 true。 [ -g $file ] 返回 false。
-k file 檢測檔案是否設定了粘著位(Sticky Bit),如果是,則返回 true。 [ -k $file ] 返回 false。
-p file 檢測檔案是否是有名管道,如果是,則返回 true。 [ -p $file ] 返回 false。
-u file 檢測檔案是否設定了 SUID 位,如果是,則返回 true。 [ -u $file ] 返回 false。
-r file 檢測檔案是否可讀,如果是,則返回 true。 [ -r $file ] 返回 true。
-w file 檢測檔案是否可寫,如果是,則返回 true。 [ -w $file ] 返回 true。
-x file 檢測檔案是否可執行,如果是,則返回 true。 [ -x $file ] 返回 true。
-s file 檢測檔案是否為空(檔案大小是否大於0),不為空返回 true。 [ -s $file ] 返回 true。
-e file 檢測檔案(包括目錄)是否存在,如果是,則返回 true。 [ -e $file ] 返回 true。

輸出

  • echo
  • print
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234

shell test命令

Shell中的 test 命令用於檢查某個條件是否成立,它可以進行數值、字元和檔案三個方面的測試。

num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '兩個數相等!'
else
    echo '兩個數不相等!'
fi

流程控制-條件語句

if condition1
then
    command1
elif condition2
then
    command2
else
    commandN
fi

迴圈語句

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

或寫成一行,此時需要注意有分號

for var in item1 item2 ... itemN; do command1; command2… done;

while語句

while condition
do
    command
done

until 迴圈,執行一系列命令直至條件為 true 時停止

until condition
do
    command
done

case語句

Shell case語句為多選擇語句。可以用case語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令。case語句格式如下:

casein
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

例子:
echo '輸入 1 到 4 之間的數字:'
echo '你輸入的數字為:'
read aNum
case $aNum in
    1)  echo '你選擇了 1'
    ;;
    2)  echo '你選擇了 2'
    ;;
    3)  echo '你選擇了 3'
    ;;
    4)  echo '你選擇了 4'
    ;;
    *)  echo '你沒有輸入 1 到 4 之間的數字'
    ;;
esac

shell函式

  • 格式
[ function ] funname [()]

{

    action;

    [return int;]

}
#例子
funWithParam(){
    echo "第一個引數為 $1 !"
    echo "第二個引數為 $2 !"
    echo "第十個引數為 $10 !"
    echo "第十個引數為 ${10} !"
    echo "第十一個引數為 ${11} !"
    echo "引數總數有 $# 個!"
    echo "作為一個字串輸出所有引數 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

重定向

  • 格式

命令 說明
command > file 將輸出重定向到 file。
command < file 將輸入重定向到 file。
command >> file 將輸出以追加的方式重定向到 file。
n > file 將檔案描述符為 n 的檔案重定向到 file。
n >> file 將檔案描述符為 n 的檔案以追加的方式重定向到 file。
n >& m 將輸出檔案 m 和 n 合併。
n <& m 將輸入檔案 m 和 n 合併。
<< tag 將開始標記 tag 和結束標記 tag 之間的內容作為輸入。
需要注意的是檔案描述符 0 通常是標準輸入(STDIN),1 是標準輸出(STDOUT),2 是標準錯誤輸出(STDERR)。

  • 例子
#希望將 stdout 和 stderr 合併後重定向到 file
command > file 2>&1
command >> file 2>&1

  • /dev/null 檔案
    • 如果希望執行某個命令,但又不希望在螢幕上顯示輸出結果,那麼可以將輸出重定向到 /dev/null:command > /dev/null
    • /dev/null 是一個特殊的檔案,寫入到它的內容都會被丟棄;如果嘗試從該檔案讀取內容,那麼什麼也讀不到。但是 /dev/null 檔案非常有用,將命令的輸出重定向到它,會起到"禁止輸出"的效果。如果希望遮蔽 stdout 和 stderr,可以這樣寫:command > /dev/null 2>&1

Shell 檔案包含

和其他語言一樣,Shell 也可以包含外部指令碼。這樣可以很方便的封裝一些公用的程式碼作為一個獨立的檔案。
Shell 檔案包含的語法格式如下:

. filename   # 注意點號(.)和檔名中間有一空格source filename