shell腳本開(kāi)發(fā)
Linux中使用多個(gè)命令
shell腳本的關(guān)鍵是在于處理多個(gè)命令沟沙,且處理每個(gè)命令的結(jié)果,或者將不同的命令結(jié)果進(jìn)行傳遞,再次加工罕模。
shell支持多個(gè)命令連接起來(lái)執(zhí)行
date;whoami
我們可以把命令組合成一個(gè)文本文件溯街,然后執(zhí)行這個(gè)文件即可诱桂。
shell腳本文件
shell腳本文件,第一行必須指定想要用的shell呈昔。
#!/bin/bash
shell腳本里挥等,#號(hào)是注釋行,shell不會(huì)處理腳本中的注釋行堤尾,然而第一行例外肝劲,該寫(xiě)法會(huì)通知shell用哪個(gè)解釋器來(lái)運(yùn)行腳本。
執(zhí)行腳本
用解釋器讀取腳本
#!/bin/bash
# This is test script
date
whoami
echo "It's Over."
直接運(yùn)行文件郭宝,需要賦予權(quán)限
當(dāng)以./test.sh該形式執(zhí)行腳本涡相,則以文件第一行的Shebang(#!)指定的解釋器執(zhí)行文件。
常用echo
在shell腳本里剩蟀,shell命令會(huì)有自己的輸出催蝗,若是你想要自定義內(nèi)容打印,以告知用戶育特,當(dāng)前腳本在做什么事丙号。
可以通過(guò)echo命令來(lái)實(shí)現(xiàn),注意單引號(hào)缰冤、雙引號(hào)犬缨。
#!/bin/bash
# This script displays the date and who's logged on
echo "The time and date are:"
date
echo ''
echo "Let's see who's logged into the system:"
who
使用變量與echo
腳本里,可以在環(huán)境變量名稱(chēng)前加上$
來(lái)使用環(huán)境變量棉浸。
#!/bin/bash
# display user information from the system
echo "User info for userid: $USER"
echo UID: $UID
echo HOME: $HOME
轉(zhuǎn)義符
當(dāng)一些情況怀薛,我們不希望shell解析一些符號(hào),可以使用單引號(hào)和轉(zhuǎn)義符對(duì)符號(hào)做不解析迷郑。
echo識(shí)別變量的情況
echo "The cost of the item is $15"
改成如下寫(xiě)法
echo 'The cost of the item is $15'
現(xiàn)在允許shell解讀$只是一個(gè)普通的美元符了
echo "The cost of the item is \$15"
變量應(yīng)用
變量被引用時(shí)會(huì)輸出賦給它的值枝恋,變量會(huì)在shell腳本退出后消失。
#!/bin/bash
# test variables
days=10
guest="mhg"
echo "$guest checked in $days days ago"
變量再賦值
變量每次被引用的時(shí)候嗡害,都會(huì)輸出賦給的值焚碌,需要加上$符
#!/bin/bash
# assigning a variable value to another variable
value1=10
value2=$value1
echo "The resulting value is $value2"
若是忘記了用美元符,則結(jié)果就錯(cuò)誤了
#!/bin/bash
# assigning a variable value to another variable
value1=10
value2=value1
echo "The resulting value is $value2"
命令替換
shell一大特性就是可以從命令中提取結(jié)果霸妹,再賦值給變量十电,這樣處理腳本數(shù)據(jù)特別方便。
有兩方式將命令輸出賦值給變量
反引號(hào)``
$()格式
$()格式
#!/bin/bash
testing=$(date)
echo "The date and time are:" $testing
#!/bin/bash
# copy the /usr/bin directory listing to a log file
today=$(date +%y%m%d)
ls /usr/bin -al > log.$today
today變量是取出命令值,也就是提取了日期鹃骂,然后再結(jié)合到文件名里使用
cat log.230327 |wc -l
反引號(hào)
反引號(hào)和$()的作用相同台盯,用于命令替換(command substitution),及完成引用
echo `date '--date=1 hour ago' +%Y-%m-%d-%H`
等同于
echo $(date '--date=1 hour ago' +%Y-%m-%d-%H)
數(shù)值計(jì)算
編程語(yǔ)言都支持?jǐn)?shù)字計(jì)算畏线,但是對(duì)于shell來(lái)說(shuō)静盅,數(shù)值計(jì)算稍微有些麻煩。
算術(shù)運(yùn)算符
下表列出了常用的算術(shù)運(yùn)算符象踊,假定變量 a 為 10温亲,變量 b 為 20:
運(yùn)算符 | 說(shuō)明 | 舉例 |
---|---|---|
+ | 加法 |
expr $a + $b 結(jié)果為 30。 |
- | 減法 |
expr $a - $b 結(jié)果為 -10杯矩。 |
* | 乘法 |
expr $a \* $b 結(jié)果為 200栈虚。 |
/ | 除法 |
expr $b / $a 結(jié)果為 2。 |
% | 取余 |
expr $b % $a 結(jié)果為 0史隆。 |
= | 賦值 |
a=$b 把變量 b 的值賦給 a魂务。 |
== | 相等。用于比較兩個(gè)數(shù)字泌射,相同則返回 true粘姜。 |
[ $a == $b ] 返回 false。 |
!= | 不相等熔酷。用于比較兩個(gè)數(shù)字孤紧,不相同則返回 true。 |
[ $a != $b ] 返回 true拒秘。 |
注意:條件表達(dá)式要放在方括號(hào)之間号显,并且要有空格,例如: [$a==$b]
是錯(cuò)誤的躺酒,必須寫(xiě)成[ $a == $b ]
押蚤。
實(shí)例
#!/bin/bash
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi
執(zhí)行腳本,輸出結(jié)果如下所示:
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b
注意:
- 乘號(hào)(*)前邊必須加反斜杠()才能實(shí)現(xiàn)乘法運(yùn)算羹应;
- if...then...fi 是條件語(yǔ)句揽碘,后續(xù)將會(huì)講解。
- 在 MAC 中 shell 的 expr 語(yǔ)法是:$((表達(dá)式))园匹,此處表達(dá)式中的 "*" 不需要轉(zhuǎn)義符號(hào) "\" 雳刺。
關(guān)系運(yùn)算符
關(guān)系運(yùn)算符只支持?jǐn)?shù)字,不支持字符串偎肃,除非字符串的值是數(shù)字煞烫。
下表列出了常用的關(guān)系運(yùn)算符,假定變量 a 為 10累颂,變量 b 為 20:
運(yùn)算符 | 說(shuō)明 | 舉例 |
---|---|---|
-eq | 檢測(cè)兩個(gè)數(shù)是否相等,相等返回 true。 |
[ $a -eq $b ] 返回 false紊馏。 |
-ne | 檢測(cè)兩個(gè)數(shù)是否不相等料饥,不相等返回 true。 |
[ $a -ne $b ] 返回 true朱监。 |
-gt | 檢測(cè)左邊的數(shù)是否大于右邊的岸啡,如果是,則返回 true赫编。 |
[ $a -gt $b ] 返回 false巡蘸。 |
-lt | 檢測(cè)左邊的數(shù)是否小于右邊的,如果是擂送,則返回 true悦荒。 |
[ $a -lt $b ] 返回 true。 |
-ge | 檢測(cè)左邊的數(shù)是否大于等于右邊的嘹吨,如果是搬味,則返回 true。 |
[ $a -ge $b ] 返回 false蟀拷。 |
-le | 檢測(cè)左邊的數(shù)是否小于等于右邊的碰纬,如果是,則返回 true问芬。 |
[ $a -le $b ] 返回 true悦析。 |
實(shí)例
#!/bin/bash
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b: a 不等于 b"
else
echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: a 大于 b"
else
echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: a 小于 b"
else
echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b: a 大于或等于 b"
else
echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
echo "$a -le $b: a 小于或等于 b"
else
echo "$a -le $b: a 大于 b"
fi
執(zhí)行腳本,輸出結(jié)果如下所示:
10 -eq 20: a 不等于 b
10 -ne 20: a 不等于 b
10 -gt 20: a 不大于 b
10 -lt 20: a 小于 b
10 -ge 20: a 小于 b
10 -le 20: a 小于或等于 b
布爾運(yùn)算符
下表列出了常用的布爾運(yùn)算符此衅,假定變量 a 為 10强戴,變量 b 為 20:
運(yùn)算符 | 說(shuō)明 | 舉例 |
---|---|---|
! | 非運(yùn)算,表達(dá)式為 true 則返回 false炕柔,否則返回 true酌泰。 |
[ ! false ] 返回 true。 |
-o | 或運(yùn)算匕累,有一個(gè)表達(dá)式為 true 則返回 true陵刹。 |
[ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a | 與運(yùn)算欢嘿,兩個(gè)表達(dá)式都為 true 才返回 true衰琐。 |
[ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
實(shí)例
#!/bin/bash
a=10
b=20
if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a == $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
echo "$a 小于 5 或 $b 大于 100 : 返回 false"
fi
執(zhí)行腳本炼蹦,輸出結(jié)果如下所示:
10 != 20 : a 不等于 b
10 小于 100 且 20 大于 15 : 返回 true
10 小于 100 或 20 大于 100 : 返回 true
10 小于 5 或 20 大于 100 : 返回 false
邏輯運(yùn)算符
以下介紹 Shell 的邏輯運(yùn)算符羡宙,假定變量 a 為 10,變量 b 為 20:
運(yùn)算符 | 說(shuō)明 | 舉例 |
---|---|---|
&& | 邏輯的 AND |
[[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| | 邏輯的 OR |
[[ $a -lt 100 || $b -gt 100 ]] 返回 true |
實(shí)例
#!/bin/bash
a=10
b=20
if [[ $a -lt 100 && $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
執(zhí)行腳本掐隐,輸出結(jié)果如下所示:
返回 false
返回 true
字符串運(yùn)算符
下表列出了常用的字符串運(yùn)算符狗热,假定變量 a 為 "abc"钞馁,變量 b 為 "efg":
運(yùn)算符 | 說(shuō)明 | 舉例 |
---|---|---|
= | 檢測(cè)兩個(gè)字符串是否相等,相等返回 true匿刮。 |
[ $a = $b ] 返回 false僧凰。 |
!= | 檢測(cè)兩個(gè)字符串是否不相等,不相等返回 true熟丸。 |
[ $a != $b ] 返回 true训措。 |
-z | 檢測(cè)字符串長(zhǎng)度是否為0,為0返回 true光羞。 |
[ -z $a ] 返回 false绩鸣。 |
-n | 檢測(cè)字符串長(zhǎng)度是否不為 0,不為 0 返回 true纱兑。 |
[ -n "$a" ] 返回 true呀闻。 |
$ | 檢測(cè)字符串是否不為空,不為空返回 true萍启。 |
[ $a ] 返回 true总珠。 |
實(shí)例
#!/bin/bash
a="abc"
b="efg"
if [ $a = $b ]
then
echo "$a = $b : a 等于 b"
else
echo "$a = $b: a 不等于 b"
fi
if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a != $b: a 等于 b"
fi
if [ -z $a ]
then
echo "-z $a : 字符串長(zhǎng)度為 0"
else
echo "-z $a : 字符串長(zhǎng)度不為 0"
fi
if [ -n "$a" ]
then
echo "-n $a : 字符串長(zhǎng)度不為 0"
else
echo "-n $a : 字符串長(zhǎng)度為 0"
fi
if [ $a ]
then
echo "$a : 字符串不為空"
else
echo "$a : 字符串為空"
fi
執(zhí)行腳本,輸出結(jié)果如下所示:
abc = efg: a 不等于 b
abc != efg : a 不等于 b
-z abc : 字符串長(zhǎng)度不為 0
-n abc : 字符串長(zhǎng)度不為 0
abc : 字符串不為空
文件測(cè)試運(yùn)算符
文件測(cè)試運(yùn)算符用于檢測(cè) Unix 文件的各種屬性勘纯。
屬性檢測(cè)描述如下:
操作符 | 說(shuō)明 | 舉例 |
---|---|---|
-b file | 檢測(cè)文件是否是塊設(shè)備文件局服,如果是,則返回 true驳遵。 |
[ -b $file ] 返回 false淫奔。 |
-c file | 檢測(cè)文件是否是字符設(shè)備文件,如果是堤结,則返回 true唆迁。 |
[ -c $file ] 返回 false。 |
-d file | 檢測(cè)文件是否是目錄竞穷,如果是唐责,則返回 true。 |
[ -d $file ] 返回 false瘾带。 |
-f file | 檢測(cè)文件是否是普通文件(既不是目錄鼠哥,也不是設(shè)備文件),如果是看政,則返回 true朴恳。 |
[ -f $file ] 返回 true。 |
-g file | 檢測(cè)文件是否設(shè)置了 SGID 位允蚣,如果是于颖,則返回 true。 |
[ -g $file ] 返回 false嚷兔。 |
-k file | 檢測(cè)文件是否設(shè)置了粘著位(Sticky Bit)森渐,如果是做入,則返回 true。 |
[ -k $file ] 返回 false章母。 |
-p file | 檢測(cè)文件是否是有名管道母蛛,如果是翩剪,則返回 true乳怎。 |
[ -p $file ] 返回 false。 |
-u file | 檢測(cè)文件是否設(shè)置了 SUID 位前弯,如果是蚪缀,則返回 true。 |
[ -u $file ] 返回 false恕出。 |
-r file | 檢測(cè)文件是否可讀询枚,如果是,則返回 true浙巫。 |
[ -r $file ] 返回 true金蜀。 |
-w file | 檢測(cè)文件是否可寫(xiě),如果是的畴,則返回 true渊抄。 |
[ -w $file ] 返回 true。 |
-x file | 檢測(cè)文件是否可執(zhí)行丧裁,如果是护桦,則返回 true。 |
[ -x $file ] 返回 true煎娇。 |
-s file | 檢測(cè)文件是否為空(文件大小是否大于0)二庵,不為空返回 true。 |
[ -s $file ] 返回 true缓呛。 |
-e file | 檢測(cè)文件(包括目錄)是否存在催享,如果是,則返回 true哟绊。 |
[ -e $file ] 返回 true因妙。 |
其他檢查符:
- -S: 判斷某文件是否 socket。
- -L: 檢測(cè)文件是否存在并且是一個(gè)符號(hào)鏈接匿情。
實(shí)例
變量 file 表示文件 /var/www/runoob/test.sh兰迫,它的大小為 100 字節(jié),具有 rwx 權(quán)限炬称。下面的代碼汁果,將檢測(cè)該文件的各種屬性:
#!/bin/bash
file="/var/www/runoob/test.sh"
if [ -r $file ]
then
echo "文件可讀"
else
echo "文件不可讀"
fi
if [ -w $file ]
then
echo "文件可寫(xiě)"
else
echo "文件不可寫(xiě)"
fi
if [ -x $file ]
then
echo "文件可執(zhí)行"
else
echo "文件不可執(zhí)行"
fi
if [ -f $file ]
then
echo "文件為普通文件"
else
echo "文件為特殊文件"
fi
if [ -d $file ]
then
echo "文件是個(gè)目錄"
else
echo "文件不是個(gè)目錄"
fi
if [ -s $file ]
then
echo "文件不為空"
else
echo "文件為空"
fi
if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在"
fi
執(zhí)行腳本,輸出結(jié)果如下所示:
文件可讀
文件可寫(xiě)
文件可執(zhí)行
文件為普通文件
文件不是個(gè)目錄
文件不為空
文件存在