#!/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"的文件