Linux入門(mén)之bash3
邏輯運(yùn)算符
&&,短路并,前面成立才執(zhí)行后面的操作
||,短路或,前面不成立才執(zhí)行后面的操作
[ 1 -ge 2 ] && echo '>=' || echo '<',1小于等于2不成立,所以執(zhí)行 echo '<'
算術(shù)運(yùn)算
((c=a+b)),支持整數(shù)的四則運(yùn)算,%取模,++,--,*=,/=
c=$(expr a + b),*要寫(xiě)做 \*轉(zhuǎn)義
let c=a+b,命令行,表達(dá)式中間不能有空格
c=$[a+b]
$RANDOM,隨機(jī)整數(shù)
echo 'scale=2;5/3' |bc,浮點(diǎn)計(jì)算,bash算術(shù)運(yùn)算不支持浮點(diǎn),bc支持
函數(shù)
變量FUNCTION代表當(dāng)前正在執(zhí)行的函數(shù)名
$0,腳本名,$1,第一個(gè)參數(shù),$2,第二個(gè)參數(shù),$@所有參數(shù),$#參數(shù)個(gè)數(shù)
$*是保存所有參數(shù)的字符串,而$@是數(shù)組
$*不用""包裹時(shí),for x in $*,會(huì)被擴(kuò)展為數(shù)組做迭代,"$*"仍被當(dāng)做字符串
函數(shù)調(diào)用時(shí)不加括號(hào),后面直接跟參數(shù)
func() {
echo $FUNCNAME
echo $0, $1, $2, $@, $#, $*
}
func a b c d
有function函數(shù)名稱(chēng)后面可以省略()
bash默認(rèn)所有變量都是全局的,跟python剛好相反
local v,聲明這個(gè)變量是局部變量,后面就按局部變量處理
v=1
function func2 {
echo v_old, $v
local v
echo v_new, $v
}
腳本
腳本的第一行是解釋器說(shuō)明,不寫(xiě)使用默認(rèn)shell
腳本的參數(shù)傳遞規(guī)則和函數(shù)的參數(shù)傳遞規(guī)則一致
#! /bin/bash
echo $0, $1, $#, $@, $*
if判斷
if根據(jù)測(cè)試條件執(zhí)行對(duì)應(yīng)的表達(dá)式,如果then跟if寫(xiě)在一行,要用 ; 隔開(kāi)
if [ $a -lt 2 ]; then
echo '2'
elif [ $a -lt 3 ]; then
echo 3
else
echo 5
fi
test "$a" = "$b",測(cè)試a和b是否相同,變量值中間沒(méi)有空格,雙引號(hào)可以省略,=可以寫(xiě)成==
[ $a != $b ],測(cè)試字符串不同,用[]代替 test,表達(dá)式之間必須有空格
[ $a \> $b ],按ascii碼比較字符串大小,\<小于
[ -n $str ],字符串非空,長(zhǎng)度不為0
[ -z $str ],字符串空,長(zhǎng)度為0
[ $a -eq $b ],數(shù)值判斷,-eq等,-ne不等,-gt大于等于,-ge,-lt,-le,具體man test
[ -f './f' ],當(dāng)前目錄下是否有名為f的普通文件,-d 判斷目錄,-e僅測(cè)試文件存在,不管文件是普通文件,目錄或者塊設(shè)備
[ -z $str -a -n $str2 ],str為空 并且 str2不為空
[ -z $str -o -n $str2 ],str為空 或 str2不為空
[ ! -z $str ],非 str為空,即str不為空
[[ $a == c* ]],字符串a(chǎn)是否已c開(kāi)頭,[[]]中字符串大小比較直接用><,[[]]比[]擴(kuò)展性好
for循環(huán)
"$*",不會(huì)被擴(kuò)展,所以顯示一個(gè)字符串
$*,被擴(kuò)展,會(huì)按照字符串中的空格斷句
for v in "$*"; do
echo $v
done
類(lèi)c循環(huán)
for((i=0; i<=$#; i++)); do
echo $i
done
while循環(huán)
a=4
b=10
while [ $a -le $b ]
do
echo $a
a=$[a+1]
done
死循環(huán),while [ 1 ]可以寫(xiě)成while :
while [ 1 ]
do
# 每循環(huán)一次,參數(shù)列表向左移動(dòng)3位
shift 3
echo $1, $#
# 死循環(huán)必須設(shè)置退出條件,否則會(huì)一直循環(huán)下去
if [ $# -le 3 ]; then
break
fi
sleep 0.2
done
case
類(lèi)似其他編程語(yǔ)言的switch
通配符如ab,ab*等,不能加引號(hào)
a=abc
case $a in
'ab')
echo 'ab';;
a*)
echo 'a*'
;;
*)
echo 'other';;
esac