Shell命令
前面我們講到了shell的常用命令:echo,這是專門用來在終端打印日志的命令,接下來我們深入講解一下這個命令。
在實際運用中常會遇到換行問題,例如:
echo "hello"
echo "world"
此時我想讓他不換行,可以這么做:
echo -e "hello \c"
echo "world"
-e:表示開啟轉(zhuǎn)義功能
\c:表示接下來不需要換行,需要和‘-e’配合使用
另外一種情況,我想一次性輸出并且換行,可以這么操作:
echo -e "hello world \nnice to meet you"
同樣要配合‘-e’轉(zhuǎn)義開關(guān)
echo還可以打印一條命令的執(zhí)行結(jié)果,格式為:echo `命令`,例如打印當(dāng)前時間:
echo `date`
注意這里的單引號不是普通的單引號,是鍵盤上esc下面那個鍵
還有一個命令:exit,作用是退出程序并可返回狀態(tài)碼,它的使用格式為:exit 參數(shù)(狀態(tài)碼),參數(shù)為可選且有較為規(guī)范的標(biāo)準(zhǔn),如下圖:

Shell數(shù)組
定義語法:數(shù)組名=(值1 值2 值3…)
數(shù)組打印
案例一:直接打印數(shù)組,默認(rèn)打印數(shù)組第一個元素
name=("張三" "李四" "王五")
echo $name
案例二:打印單個數(shù)組元素,語法結(jié)構(gòu):${數(shù)組名[下標(biāo)]}
name=()
name[0]="張三"
name[1]="李四"
name[2]="王五"
echo ${name[0]}? ${name[1]}?${name[2]}
案例三:打印所有數(shù)組元素,語法結(jié)構(gòu):${數(shù)組名[*]} 或者?${數(shù)組名[@]}
name=("張三" "李四" "王五")
echo ${name[@]}
echo ${name[*]}
這兩種方式有區(qū)別,
${數(shù)組名[*]} 是讀取數(shù)組所有元素當(dāng)成一個字符串輸出,類似于:“張三,李四,王五”
?${數(shù)組名[@]} 是挨個讀取數(shù)組元素并且當(dāng)成單個字符串依次輸出,類似于:“張三” “李四” “王五”
獲取數(shù)組長度
方式一:語法:${#數(shù)組名[@]}
方式二:語法:${#數(shù)組名[*]}
代碼:
name=("張三" "李四" "王五")
echo ${#name[*]}
echo ${#name[@]}
結(jié)果都為:3
Shell腳本里有個有趣的事情就是數(shù)組下標(biāo)可以無限大 程序不報錯 沒有越界crash 但是如果傳負(fù)值就會報錯
Shell腳本語言-流程控制
"if"語句,語法結(jié)構(gòu)
?if [ 條件 ]
then
????代碼
fi
有2個條件時:
?if [ 條件 ]
then
????代碼
else
fi
有超過2個條件時:
if [ 條件 ]
then
????代碼
elif
then
......
else
fi
for 循環(huán)語句
語法結(jié)構(gòu)
for ((條件))
do
代碼
done
代碼示例,循環(huán)打印0到4:
for((i=0;i<5;i++))
do
echo $i
done
無限循環(huán)可以這樣寫:
for((;;))
do
代碼
done
"for in"循環(huán)語句
語法結(jié)構(gòu)
for 變量名 in 數(shù)組
do
代碼
done
代碼案例,循環(huán)打印數(shù)組所有元素
names=("張三" "李四" "王五")
for name in ${names[@]}
do
? ? echo ${name}
done
while 循環(huán)
語法結(jié)構(gòu)
while((條件))
do
代碼
done
代碼案例,循環(huán)打印0到5
?a=0
while(($a<10))
do
echo ${a}
a=`expr $a + 1`
done
無限循環(huán)可以這樣寫:
while :
do
代碼
done
case 語句
語法結(jié)構(gòu)
case 值 in
??????????????? 模式1)
???????????????????? 代碼
???????????????????? ;;
??????????????? 模式2)
???????????????????? 代碼
???????????????????? ;;
????????????????......
??????????????? esac
代碼案例一
number=1
case $number in
1)?
echo "等于1"
;;
2)?
echo "等于2"
;;
3)?
echo "等于3"
;;
esac
until 循環(huán),字面意思是達(dá)到什么什么條件時就退出循環(huán)
語法結(jié)構(gòu)
until ((條件))
do
代碼
done
代碼示例:
number=1
until (( $number >5))
do
echo"number為${number}"
number=`expr $number + 1`
done
break 跳出循環(huán)
語法結(jié)構(gòu) break 跳出循環(huán)層數(shù),不傳參數(shù)時默認(rèn)有個參數(shù)為1,即為跳出一層循環(huán),例如:
for((i=0;i<5;i++))
do
? ? echo "外層循環(huán)"
? ? for((j=0;j<5;j++))
? ? do
? ? ? ? echo"內(nèi)層循環(huán)"
? ? ? ? break 2
? ? done
done
這里會直接跳出2層循環(huán),即當(dāng)前程序結(jié)束了
continue 跳出當(dāng)前循環(huán)開始下一個循環(huán)
代碼示例,當(dāng)j=2時不輸出,進(jìn)入下一個循環(huán):
for((j=0;j<3;j++))
do
? ? if[ $j -eq1 ]
? ? then
? ? ? ? continue
? ? fi
? ? echo "當(dāng)前循環(huán)次數(shù) j =${j}"
done
Shell運算符
算數(shù)運算符
a=1
b=2
#加法
add=`expr $a + $b`
#減法
sub=`expr $a - $b`
#乘法
mul=`expr $a \* $b`
#除法
div=`expr $a / $b`
#取余
num=`expr $a % $b`
#賦值
num2=$num
echo "c的值:$c"
expr 運算表達(dá)式,為特定命令,在進(jìn)行算數(shù)運算時使用,同時單引號為特殊單引號,乘法時需要轉(zhuǎn)義“*”
關(guān)系運算符
"-eq":檢測兩個數(shù)是否相等,當(dāng)?shù)确祷豻rue
代碼示例:
a=100
b=200
if[ $a -eq $b ]
then
? ? echo "a等于b"
else
? ? echo "a不等于b"
fi
其他判斷如下圖:

布爾運算符
"!":非運算,表達(dá)式為true,返回true,否則返回false
a=100
b=200
if[ $a != $b ]
then
?? ? echo "a不等于b"
fi
c=100
d=100
if[ $c == $d ]
then
?? ? echo"c等于d"
else
?? ? echo "c不等于d"
fi
其他判斷如下圖

Shell邏輯運算符
"&&":邏輯且
a=100
b=200
if[ $a -lt 200 ] && [$b -gt 200 ]
then
?? ? echo"成立"
else
?? ? echo"不成立"
fi

Shell字符串運算符
"=":檢測兩個字符串是否相等,如果相等返回true
a="test"
b="sorry"
if [ $a = $b ]
then
echo "字符串a(chǎn)等于字符串b"
else
echo "字符串a(chǎn)不等于字符串b"
fi
if [ $a != $b ]
then
echo "字符串a(chǎn)不等于字符串b"
else
echo "字符串a(chǎn)等于字符串b"
fi
if [ $a ]
?then
echo "a不為空"
else
echo
"a為空或者不存在"
fi
其他運算符:

其中有個坑,“-n”檢測字符串是否有內(nèi)容或者存在,我們一般這么寫:
a="test"
if[ -n $a ]
then
echo "字符串存在或有內(nèi)容"
else
echo "字符串為空或不存在"
fi
但是實際情況你會發(fā)現(xiàn)無論把a刪了還是把a的值清空始終都是判斷為有內(nèi)容或者存在,此處需要這么改才能正常判斷:
a="test"
if[ -n"$a"]
then
echo "字符串存在或有內(nèi)容"
else
echo "字符串為空或不存在"
fi
Shell文件運算符
"-d 文件路徑":檢測目標(biāo)是不是一個目錄,如果是,那么返回true
if [ -d $file ]
then
echo "是一個目錄"
else
?echo "不是一個目錄"
fi
其他運算符:
