1. 程式人生 > 其它 >Shell基本語法---基礎

Shell基本語法---基礎

#!/usr/bin/env bash

#----------------------
# 這裡是註釋
#----------------------

<<EOF
這裡是多行註釋
EOF

echo "hello, world"

# printf 後面的格式化字串可以是加雙引號,可以加單引號,可以不加引號
printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 楊過 男 48.6543
printf "%-10s %-8s %-4.2f\n
" 郭芙 女 47.9876 name="abc" # 定義變數,等號兩邊不能有空格 unset name # 登出變數 # 區域性變數 - 區域性變數是僅在某個指令碼內部有效的變數。它們不能被其他的程式和指令碼訪問。 # 環境變數 - 環境變數是對當前shell會話內所有的程式或指令碼都可見的變數。建立它們跟建立區域性變數類似,但使用的是 export 關鍵字,shell 指令碼也可以定義環境變數。 # 資料型別:整型 字串 陣列 # 單引號不識別變數,雙引號識別變數 str1="abc" str2="123" echo "$str1""$str2" # 獲取字串長度 echo
"${#str1}" # 獲取子串長度,下標從0開始,最後一個引數擷取字串個數 str3="123456" echo ${str3:1:3} echo ${str3:1:1} # 查詢子字串的位置 str4="123456aabcdef" echo `expr index ${str4} aa` # bsah只支援一維陣列,下標必須大於等於0 arr1=("aa", "bb", "cc") arr2=([2]=2 [0]=0 [1]=1) echo ${arr1[0]} echo ${arr1[1]} echo ${arr1[*]} # 輸出全部陣列元素 echo ${arr1[@]} # 輸出全部陣列元素
echo ${#arr1[*]} # 訪問陣列長度 arr3=("11", ${arr1[*]}, "22") # 向陣列中新增元素,實際上是建立一個新陣列 echo ${arr3[*]} unset arr2[2] # 刪除陣列中的元素 echo ${arr2[*]} # 算術運算 <<EOF 運算子 說明 舉例 + 加法 expr $x + $y 結果為 30- 減法 expr $x - $y 結果為 -10* 乘法 expr $x * $y 結果為 200/ 除法 expr $y / $x 結果為 2% 取餘 expr $y % $x 結果為 0= 賦值 x=$y 將把變數 y 的值賦給 x。 == 相等 用於比較兩個數字,相同則返回 true。 [ $x == $y ] 返回 false!= 不相等 用於比較兩個數字,不相同則返回 true。[ $x != $y ] 返回 true。 EOF a=10 b=20 echo `expr $a + $b` echo `expr $a - $b` echo `expr $a / 3` # 關係運算:關係運算符只支援數字,不支援字串,除非字串的值是數字 <<EOF 運算子 說明 舉例 -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。 EOF if [[ ${a} -eq ${b} ]]; then echo "${a} -eq ${b} : a 等於 b" else echo "${a} -eq ${b}: a 不等於 b" fi # 布林運算 <<EOF 運算子 說明 舉例 ! 非運算,表示式為 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。 EOF if [[ ${a} -eq ${b} && false ]]; then echo "${a} -eq ${b} : a 等於 b" else echo "${a} -eq ${b}: a 不等於 b" fi # 字串運算子 <<EOF 運算子 說明 舉例 = 檢測兩個字串是否相等,相等返回 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。 EOF s="abcd" if [[ -z $s ]]; then echo "字串是空" else echo "字串不是空" fi # 檔案測試運算子 <<EOF 操作符 說明 舉例 -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。 EOF file="/etc/hosts" if [[ -r ${file} ]]; then echo "${file} 檔案可讀" else echo "${file} 檔案不可讀" fi echo "*********************************************************" # 控制語句 x=1 y=2 if [[ $x > $y ]]; then echo "x > y" elif [[ $x < $y ]]; then echo "x < y" else echo "x = y" fi operator="+" case $operator in "+") echo `expr $x + $y` ;; "-") echo `expr $x - $y` ;; "*") echo `expr $x * $y` ;; "/") echo `expr $x / $y` ;; *) echo "default" ;; esac z=1.2 case $z in 1.2) echo "two" ;;& "1.2") echo "one" ;; *) echo "default" ;; esac # )匹配case,;;表示break,*)表示匹配任意條件,也就是最後的default # ;;& 後面的條件繼續匹配,匹配的case會進入執行 # ;& 後面挨著的一個case無條件執行,直到break跳出 # 迴圈語句 for x in 2 3 4 5 6 do echo $x done data=(8 9 10) for x in ${data[*]} do echo $x done for (( i = 0; i < 10; i++ )); do echo $i done for path in /home/chusiyong/* do echo $path done x=0 while [[ ${x} -lt 10 ]] do echo $((x * x)) x=$((x + 1)) done x=0 until [[ ${x} -ge 5 ]]; do echo ${x} x=`expr ${x} + 1` done # 函式 <<EOF [ function ] funname [()] { action; [return int;] } 函式定義時,function關鍵字可有可無。 函式返回值,return返回函式返回值,返回值型別只能為整數(0-255)。如果不加return語句,shell預設將以最後一條命令的執行結果,作為函式返回值。 函式返回值在呼叫該函式後通過 $?來獲得。 所有函式在使用前必須定義。這意味著必須將函式放在指令碼開始部分,直至shell直譯器首次發現它時才可以使用。呼叫函式僅使用其函式名即可 函式內部獲取引數 變數 描述 $0 指令碼名稱 $1 … $9 第 1 個到第 9 個引數列表 ${10} … ${N} 第 10 個到 N 個引數列表 $* or $@ 除了$0外的所有位置引數 $# 不包括$0在內的位置引數的個數 $FUNCNAME 函式名稱(僅在函式內部有值) 函式呼叫 funname arg1 arg2 ... EOF func () { echo "$1" echo "$2" echo "$#" } func "one" "two" # shell擴充套件 # 大括號擴充套件 echo {0..10} echo {0..10..2} # 命令置換 now=`date +%T` echo $now # 單引號和雙引號之間有很重要的區別。在雙引號中,變數引用或者命令置換是會被展開的。在單引號中是不會。 INPUT="A string with strange whitespace." echo $INPUT echo "$INPUT" # 重定向 <<EOF 程式碼 描述符 描述 0 stdin 標準輸入 1 stdout 標準輸出 2 stderr 標準錯誤輸出 EOF # command > /dev/null 2>&1 標準輸出和標準錯誤都輸出到/dev/null # command > /dev/null 2>1 標準錯誤輸出到檔名是"1"的檔案