淺嘗shell
阿新 • • 發佈:2022-02-06
運算子
數字運算子
原生bash不支援簡單的數學運算,但是可以通過其他命令來實現,例如 awk 和 expr,expr 最常用。
算數運算子
# 算數運算子 # + 加法 val=`expr 2 + 2` echo "兩數之和為: $val" # - 減法 val=`expr 4 - 2` echo "兩數之差為: $val" # * 乘法 val=`expr 2 \* 2` echo "兩數之積為: $val" #! tip: 乘號(*)前邊必須加反斜槓(\)才能實現乘法運算 # / 除法 val=`expr 4 / 2` echo "兩數之商為:$val" # % 取餘 val=`expr 8 % 3` echo "8 對 3 取餘數得:$val" # = 賦值 var=2 echo "val的值為: $val" # todo 下方用於判斷 # == 判斷是否相等 var1=2 var2=4 if [ $a == $b ] then echo "a 等於 b" else echo "a 不等於 b" fi # != 判斷是否不相等 var1=2 var2=4 if [ $a != $b ] then echo "a 不等於 b" else echo "a 等於 b" fi
# 關係運算符
-gt === a>b a是否大於b a>b? 大於返回true
-lt === a<b a是否小於b a<b? 小於返回true
-ge === a>=b a是否大於等於b a>=b? 是返回true
-le === a<=b a是否小於等於b a<=b? 是返回true
-eq === 相等(比較兩個數字) 返回true
-ne === 不相等(比較兩個數字) 返回 true
布林運算子&邏輯運算子
# 布林運算子 # shell 與或非運算 -a -o ! # 與運算 var1=30 var2=0 [ $var1 -a $var2 ] # 返回 false 因為0為假 var1=30 var2=31 [ $var1 -a $var2 ] # 返回true 因為兩者都為真 # 或運算 var1=30 var2=0 [ $var1 -o $var2 ] # 返回true 因為兩者有一個為真 # 非運算 var1=30 [ !$var1 ] # 返回false 因為 var1 為真 取非為假 var1=0 [ !$var1 ] # 返回true 因為 var1 為假 取非為真 # 邏輯執行算符 # && || # && 邏輯 and var1=1 var2=0 [[ $var1 && $var2 ]] # 返回false var1=1 var2=2 [[ $var1 && $var2 ]] # 返回true # || 邏輯 or var1=1 var2=0 [[ $var1 || $var2 ]] # 返回true var1=0 var2=0 [[ $var1 || $var2 ]] # 返回false
字串運算子
# = 判斷兩個字元是否相等 var_1='h' var_2='p' [ $var_1 = $var_2 ] # 返回false # != 判斷兩個字串是否不相等 var_1='h' var_2='p' [ $var_1 != $var_2 ] # 返回true # -z 判斷字串長度是否不為零 var_1="" if [ -z "$str_A" ]; then echo '長度為零'; else echo "長度不為零";fi # 結果為零 var_1='He' if [ -z "$str_A" ]; then echo '長度為零'; else echo "長度不為零";fi # 結果不為零 # -n 判斷字串長度是否不為零 與 -z相反 # $ 檢測字串是否為空 不為空則返回true
檔案測試運算子
檔案測試運算子用於測試Unix檔案的各種屬性
以下的file皆指檔案路徑*
例如:file="/usr/local/hello.sh"
# -b file 檢測檔案是否是塊裝置檔案 如果是則返回true
[ -b $file ]
# -c file 檢測檔案是否是字元裝置檔案 如果是則返回true
[ -c $file]
# -d file 檢測檔案是否是目錄 如果是則返回true
[ -d $file]
# -f file 檢測檔案是否是普通檔案(既不是目錄,也不是裝置檔案) 如果是則返回true
[ -f $file]
# -g file 檢測檔案是否設定了 SGID 位,如果是,則返回 true。
[ -g $file ]
# -k file 檢測檔案是否設定了粘著位(Sticky Bit),如果是,則返回 true。
[ -k $file ]
# -p file 檢測檔案是否是有名管道,如果是,則返回 true。
[ -p $file ]
# -u file 檢測檔案是否設定了 SUID 位,如果是,則返回 true。
[ -u $file ]
# -r file 檢測檔案是否可讀,如果是,則返回 true。
[ -r $file ]
# -w file 檢測檔案是否可寫,如果是,則返回 true。
[ -w $file ]
# -x file 檢測檔案是否可執行,如果是,則返回 true。
[ -x $file ]
# -s file 檢測檔案是否為空(檔案大小是否大於0),不為空返回 true。
[ -s $file ]
# -e file 檢測檔案(包括目錄)是否存在,如果是,則返回 true。
[ -e $file ]
# todo tip: 其他檢查符 -S: 判斷某檔案是否 socket。 -L: 檢測檔案是否存在並且是一個符號連結。
讀取字串個數
str=”hello world“
echo "str的長度為: ${#str}"
流程控制
if
if ['判斷體'] // if流程開始
then // 執行體
echo '判斷為真我被執行'
elif //
then
echo '可能存在多個判斷條件 我符合'
else // else 不寫then
echo '我不符合條件 so被執行'
fi // 結束此次if判斷
for
for str in item1 item2 item3.... itemN # 開始迴圈的物件
do # 迴圈體
echo $str
done # 結束迴圈
# 以上內容可以寫成一行 但要在注意格式
for str in item1 item2 item3.... itemN; do echo $str; done;
while
#! /bin/bash
int=1
while(($int<=5)) # 迴圈條件
do # 符合條件的迴圈結果
echo $int
let "int++"
done # 結束迴圈
let用法
let arg [arg...]# 要執行的表示式
# 例項操作
no=2
# 自加操作
let 'no++' === let no+=1
# 自減操作
let 'no--' === let no-=1