1. 程式人生 > 其它 >淺嘗shell

淺嘗shell

運算子

數字運算子

原生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