??Shell 是一個(gè)用 C 語言編寫的程序,它是用戶使用 Linux 的橋梁。Shell 既是一種命令語言,又是一種程序設(shè)計(jì)語言。學(xué)習(xí)shell命令主要是為了如下:
??1)需要看懂運(yùn)維人員編寫的Shell程序。
??2)偶爾會(huì)編寫一些簡單Shell程序來管理集群、提高開發(fā)效率。
1. Shell變量
??變量的命名規(guī)則如下:
??1)命名只能使用英文字母,數(shù)字和下劃線,首個(gè)字符不能以數(shù)字開頭。
??2)中間不能有空格,可以使用下劃線(_)。
??3)不能使用標(biāo)點(diǎn)符號(hào)。
??4)不能使用bash里的關(guān)鍵字(可用help命令查看保留關(guān)鍵字)。
_var="hello world"
??通過$+變量名訪問該變量
echo $_var
??可以通過readonly命令設(shè)置變量只讀
readonly _var
??可以通過unset刪除該變量,之后將無法訪問該變量。
unset -var
??單引號(hào)中的任何字符串都會(huì)進(jìn)行原樣輸出,但是雙引號(hào)中將會(huì)把變量替換為真實(shí)的值。
name=hello
echo '$name,world'
echo "$name, world"
echo $name"world"
echo $name'world'
??輸出的結(jié)果為
$name,world
hello, world
helloworld
helloworld
??字符串的一些函數(shù)
str="hello,world"
echo ${#str} //打印該字符串的長度
echo ${str:1:4} //從下標(biāo)為1 的字符串截取長度為4 的字符
??數(shù)組的定義方式
1. arr_name=(value1 value2 ...)
2. arr_name=(
value1
value2
...
)
3. arr_name[0]=value1
arr_name[1]=value2
echo ${arr_name[index]} //獲取對(duì)應(yīng)下標(biāo)的字符串,當(dāng)index的值是@表示取所有
echo ${#arr_name[index]} //獲取對(duì)應(yīng)下標(biāo)的長度
2. Shell傳遞參數(shù)
echo 'echo $0 $1 $2' > test.sh
sh test.sh 1 2
輸出: test.sh 1 2
??常用的關(guān)于參數(shù)的訪問如下
$n 獲取傳遞腳本中第n個(gè)參數(shù),0代表執(zhí)行的文件名稱,n大于10時(shí),要用${n}
$# 傳遞到腳本的參數(shù)個(gè)數(shù)
$* 以一個(gè)'單'字符串顯示所有向腳本傳遞的參數(shù)。
$$ 腳本運(yùn)行的當(dāng)前進(jìn)程ID號(hào)
$! 后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的ID號(hào)
$@ 顯示所有向腳本傳遞的參數(shù)
$? 顯示最后命令的退出狀態(tài)。0表示沒有錯(cuò)誤,其他任何值表明有錯(cuò)誤。
3. Shell運(yùn)算符
??基本語法
`expr 運(yùn)算式` eg: val=`expr 2 + 2` 注:expr運(yùn)算符間要有空格
$(( 運(yùn)算式)) eg: val=$((2+2))
$[運(yùn)算式] eg: val=$[2+2]
??支持的所有運(yùn)算符包括算數(shù)運(yùn)算符、關(guān)系運(yùn)算符、布爾運(yùn)算符和邏輯運(yùn)算符等等。

算數(shù)運(yùn)算符

關(guān)系運(yùn)算符

布爾運(yùn)算符

邏輯運(yùn)算符

字符串運(yùn)算符
4.流程控制
1.IF ELSE
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
eg: 判斷傳入?yún)?shù)的大小
l=$1
r=$2
if [ $l == $r ]
then
echo "$l和$r相等"
elif [ $l -gt $r ]
then
echo "$l大于$r"
else
echo "$l小于$r"
fi
??if else也經(jīng)常和tes命令結(jié)合起來使用
if test 1 -eq 1
then echo "相等"
else echo "不相等"
fi
- for循環(huán)
??基本語法如下:
for var in item1 item2 ... itemN
do
command1
command2
...
done
eg:遍歷并輸出數(shù)組中的每個(gè)元素
arr=(1 2 3 4)
for item in ${arr[@]}
do
echo "值為:$item"
done
3.while 循環(huán)
??基礎(chǔ)語法如下:
while condition
do
command
done
eg: 輸出10以內(nèi)的偶數(shù)
n=0
while (($n <= 10))
do
printf "%s \t" $n
n=$[2+$n]
done
4.無限循環(huán)
1.
while :
do
command
done
2
while true
do
command
done
3
for (( ; ; ))
do
command
done
- util循環(huán)
在滿足條件之前,一直會(huì)執(zhí)行
until condition
do
command
done
- case選擇
基本語法如下
case 值 in
模式1)
command1
command2
...
;;
模式2)
command1
command2
...
;;
esac
eg: 根據(jù)選擇的數(shù)字進(jìn)行回應(yīng)
echo '請(qǐng)輸入你的選擇'
case $1 in
1)
echo "你選擇了1" ;;
2)
echo "你選擇了2";;
*)
echo "你選擇了其他";;
esac
5. Shell函數(shù)
基本語法如下:
[ function ] funname [()]
{
action;
[return int;]
}
eg:對(duì)傳入?yún)?shù)求和
function add(){
echo "從函數(shù)中傳遞的參數(shù)為$1"
echo "這是一個(gè)求和的函數(shù)"
echo "請(qǐng)輸入第一個(gè)參數(shù)"
read a
echo "請(qǐng)輸入第二個(gè)參數(shù)"
read b
return $[ $a + $b ];
}
echo "函數(shù)開始"
var1=$[$1+1]
add $var1
var=$?
echo "函數(shù)執(zhí)行結(jié)束,結(jié)果為$var"