Linux之shell開(kāi)發(fā)初識(shí)

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è)目錄
文件不為空
文件存在
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末玲躯,一起剝皮案震驚了整個(gè)濱河市据德,隨后出現(xiàn)的幾起案子鳄乏,更是在濱河造成了極大的恐慌,老刑警劉巖棘利,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橱野,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡善玫,警方通過(guò)查閱死者的電腦和手機(jī)水援,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)茅郎,“玉大人蜗元,你說(shuō)我怎么就攤上這事∠等撸” “怎么了奕扣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)掌敬。 經(jīng)常有香客問(wèn)我惯豆,道長(zhǎng),這世上最難降的妖魔是什么奔害? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任楷兽,我火速辦了婚禮,結(jié)果婚禮上舀武,老公的妹妹穿的比我還像新娘拄养。我一直安慰自己,他們只是感情好银舱,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布瘪匿。 她就那樣靜靜地躺著,像睡著了一般寻馏。 火紅的嫁衣襯著肌膚如雪棋弥。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天诚欠,我揣著相機(jī)與錄音顽染,去河邊找鬼。 笑死轰绵,一個(gè)胖子當(dāng)著我的面吹牛粉寞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播左腔,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼唧垦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了液样?” 一聲冷哼從身側(cè)響起振亮,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤巧还,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后坊秸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體麸祷,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年褒搔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阶牍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡站超,死狀恐怖荸恕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情死相,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布咬像,位于F島的核電站算撮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏县昂。R本人自食惡果不足惜肮柜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望倒彰。 院中可真熱鬧审洞,春花似錦、人聲如沸待讳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)创淡。三九已至痴晦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琳彩,已是汗流浹背誊酌。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留露乏,地道東北人碧浊。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瘟仿,于是被迫代替她去往敵國(guó)和親箱锐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 前言 Google Play應(yīng)用市場(chǎng)對(duì)于應(yīng)用的targetSdkVersion有了更為嚴(yán)格的要求猾骡。從 2018 年...
    申國(guó)駿閱讀 63,996評(píng)論 14 98
  • """1.個(gè)性化消息: 將用戶的姓名存到一個(gè)變量中瑞躺,并向該用戶顯示一條消息敷搪。顯示的消息應(yīng)非常簡(jiǎn)單,如“Hello ...
    她即我命閱讀 2,877評(píng)論 0 5
  • 我們都是軟弱的人幢哨,所以才會(huì)說(shuō)謊赡勘。我們都是膽小的人,所以才要武裝捞镰。我們都是一群笨蛋闸与,所以才會(huì)互相傷害。
    所羅門(mén)的偽證_dc0a閱讀 2,041評(píng)論 0 3
  • 為了讓我有一個(gè)更快速岸售、更精彩践樱、更輝煌的成長(zhǎng),我將開(kāi)始這段刻骨銘心的自我蛻變之旅凸丸!從今天開(kāi)始拷邢,我將每天堅(jiān)持閱...
    李薇帆閱讀 1,707評(píng)論 0 2
  • 似乎最近一直都在路上,每次出來(lái)走的時(shí)候感受都會(huì)很不一樣屎慢。 1瞭稼、感恩一直遇到好心人,很幸運(yùn)腻惠。在路上總是...
    時(shí)間里的花Lily閱讀 1,177評(píng)論 0 1