古之立大事者,不惟有超世之才,亦必有堅忍不拔之志。——蘇軾
printf命令用于格式化輸出,類似于C/C++中的printf函數(shù)。
printf "%10d.\n" 123 # 占10位,右對齊
printf "%-10.2f.\n" 123.123321 # 占10位,保留2位小數(shù),左對齊
printf "My name is %s\n" "yxc" # 格式化輸出字符串
printf "%d * %d = %d\n" 2 3 `expr 2 \* 3` # 表達(dá)式的值作為參數(shù)
二、test命令與判斷符號[]
1.邏輯運算符&&和||test命令用于判斷文件類型,以及對變量做比較。
test命令用exit code返回結(jié)果,而不是使用stdout。0表示真,非0表示假。
acs@9e0ebfcd82d7:~$ ls # 列出當(dāng)前目錄下的所有文件
homework output.txt test.sh tmp
acs@9e0ebfcd82d7:~$ test -e test.sh && echo "exist" || echo "Not exist"
exist # test.sh 文件存在
acs@9e0ebfcd82d7:~$ test -e test2.sh && echo "exist" || echo "Not exist"
Not exist # testh2.sh 文件不存在
代碼如下(示例):
test 2 -lt 3 # 為真,返回值為0
echo $? # 輸出上個命令的返回值,輸出0
3.文件類型判斷命令格式:
test -e filename # 判斷文件是否存在
4.文件權(quán)限判斷test -r filename # 判斷文件是否可讀
5.整數(shù)間的比較test $a -eq $b # a是否等于b
6.字符串比較7.多重條件判定test -r filename -a -x filename
8.判斷符號[][]與test用法幾乎一模一樣,更常用于if語句中。另外[[]]是[]的加強版,支持的特性更多。
[ 2 -lt 3 ] # 為真,返回值為0
echo $? # 輸出上個命令的返回值,輸出0
注意
[]內(nèi)的每一項都要用空格隔開
中括號內(nèi)的變量,最好用雙引號括起來
中括號內(nèi)的常數(shù),最好用單或雙引號括起來
三、判斷語句if…then形式
類似于C/C++中的if-else語句。
單層ifif condition
then
語句1
語句2
...
fi
單層if-else示例:
if condition
then
語句1
語句2
...
else
語句1
語句2
...
fi
多層if-elif-elif-else示例:
if condition
then
語句1
語句2
...
elif condition
then
語句1
語句2
...
elif condition
then
語句1
語句2
else
語句1
語句2
...
fi
case…esac形式示例
case $變量名稱 in
值1)
語句1
語句2
...
;; # 類似于C/C++中的break
值2)
語句1
語句2
...
;;
*) # 類似于C/C++中的default
語句1
語句2
...
;;
esac
四、循環(huán)語句 1.命令格式1:示例
for var in val1 val2 val3
do
語句1
語句2
...
done
示例
示例二
輸出當(dāng)前路徑下的所有文件名,每個文件名一行:
for file in `ls`
do
echo $file
done
示例三(輸出1-10,10個數(shù))
for i in $(seq 1 10)
do
echo $i
done
示例四(使用{1…10} 或者 {a…z})
for i in {a..n}
do
echo $i
done
2.,命令格式2for ((expressi**加粗樣式**on; condition; expression))
do
語句1
語句2
done
3.while…do…done循環(huán)示例
while condition
do
語句1
語句2
...
done
4.until…do…done循環(huán)示例
當(dāng)條件為真時結(jié)束。
until condition
do
語句1
語句2
...
done
5.break命令
跳出當(dāng)前一層循環(huán),注意與C/C++不同的是:break不能跳出case語句。
while read name
do
for ((i=1;i<=10;i++))
do
case $i in
8)
break
;;
*)
echo $i
;;
esac
done
done
6.continue命令for ((i=1;i<=10;i++))
do
if [ `expr $i % 2` -eq 0 ]
then
continue
fi
echo $i
done
五、函數(shù)bash中的函數(shù)類似于C/C++中的函數(shù),但return的返回值與C/C++不同,返回的是exit code,取值為0-255,0表示正常結(jié)束。
如果想獲取函數(shù)的輸出結(jié)果,可以通過echo輸出到stdout中,然后通過$(function_name)來獲取stdout中的結(jié)果。
函數(shù)的return值可以通過$?來獲取。
[function] func_name() {# function關(guān)鍵字可以省略
語句1
語句2
...
}
func() {name=yxc
echo "Hello $name"
}
func
func() {name=yxc
echo "Hello $name"
return 123
}
output=$(func)
ret=$?
echo "output = $output"
echo "return = $ret"
六-exit命令exit命令用來退出當(dāng)前shell進程,并返回一個退出狀態(tài);使用$?可以接收這個退出狀態(tài)。
exit命令可以接受一個整數(shù)值作為參數(shù),代表退出狀態(tài)。如果不指定,默認(rèn)狀態(tài)值是 0。
exit退出狀態(tài)只能是一個介于 0~255 之間的整數(shù),其中只有 0 表示成功,其它值都表示失敗。
#! /bin/bash
if [ $# -ne 1 ] # 如果傳入?yún)?shù)個數(shù)等于1,則正常退出;否則非正常退出。
then
echo "arguments not valid"
exit 1
else
echo "arguments valid"
exit 0
fi
七–文件重定向每個進程默認(rèn)打開3個文件描述符:
可以用文件重定向?qū)⑦@三個文件重定向到其他文件中
命令 說明
command >file 將stdout重定向到file中
command< file 將stdin重定向到file中
command >>file 將stdout以追加方式重定向到file中
command n>file 將文件描述符n重定向到file中
command n>>file 將文件描述符n以追加方式重定向到file中
示例
echo -e "Hello \c">output.txt # 將stdout重定向到output.txt中
echo "World">>output.txt # 將字符串追加到output.txt中
read str< output.txt # 從output.txt中讀取字符串
echo $str # 輸出結(jié)果:Hello World``
八 --引入外部腳本語法格式
. filename # 注意點和文件名之間有一個空格
或
source filename
示例
創(chuàng)建test1.sh,內(nèi)容為:
#! /bin/bash
name=yxc # 定義變量name
然后創(chuàng)建test2.sh,內(nèi)容為:
#! /bin/bash
source test1.sh # 或 . test1.sh
echo My name is: $name # 可以使用test1.sh中的變量
執(zhí)行命令:
acs@9e0ebfcd82d7:~$ chmod +x test2.sh
acs@9e0ebfcd82d7:~$ ./test2.sh
My name is: yxc
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧