Shell腳本編程(一)

1. 前言

前面我們學習了Linux相關的命令豪硅,接下來我們將進入真正的主題——shell腳步編程。

2. 直接執(zhí)行命令

首先創(chuàng)建一個shell文件并用Vim編輯器打開

vim 01.sh

這時候已經進入命令模式虱咧,鍵盤點擊i進入編輯模式耕拷,我們簡單的輸出當前時間和當前用戶:

#!/bin/bash                                                                       
date
who

第一行表示這是Shell中的bash,即Bourne Again Shell萧求,Shell中的一種其兴。我們按Esc退出編輯模式進入命令模式,再按shift + z z退出命令模式夸政,這時候沒有執(zhí)行的權限元旬,我們需要授予其執(zhí)行的權限

chmod u+x 01.sh

最后命令行輸入

./01.sh

執(zhí)行后的結果為:

Thu Dec 21 18:07:25 CST 2017
root     pts/0        2017-12-21 16:27 (111.196.87.96)

3. 創(chuàng)建變量

#!/bin/bash                                                                                                                                                                                                  
n=10
s="I Love You"
echo $n
echo $s

這里的n和s都是變量,echo是輸出命令守问,但是可以引號內部有空格匀归,如果s=I Love You就會出錯,因為中間有空格耗帕。此例輸出結果為:

10
I Love You

還可以這樣進行拼接

echo "$s very much"

輸出結果為:

I Love You very much

這時候穆端,有人就要問了,那我要怎樣輸出符號呢仿便?其實很簡單体啰,只需要加上轉義字符\,比如我們要輸出s嗽仪,就可以這樣:

echo "\$s"

4. 將命令的結果作為變量的值

curTime=`date`
echo $curTime

其中**是鍵盤左上方波浪線下面的字符荒勇,**是鍵盤左上方波浪線下面的字符,``表示內部是命令闻坚,此例是將date命令的結果作為變量curTime的值了沽翔,輸出結果為:

Thu Dec 21 19:44:51 CST 2017

除了這種做法,還可以:

curTime=$(date)
echo $curTime

輸出結果是完全一樣的窿凤。

5. 輸出重定向

將ls -la命令生成的結果輸出到text文件中

ls -la > text

輸入重定向

wc < text

將text文本中的內容輸入搀擂,wc命令是輸出文本的行數、單詞數卷玉、字節(jié)數哨颂。

6. 數學運算

1. 基本整數運算

a=10
b=40
c=$(expr $b / $a)
echo "c=$c"

輸出結果為:

c=4

其中expr命令表示此處是數學運算,expr只能進行整數運算相种。此處的還可以這樣表示:

d=$[$b / $a]

結果是一樣的威恼。

2. 浮點數運算

由于expr只支持整數運算品姓,對于浮點數運算,我們需要用到bc命令

e=$(echo "scale=4; $a / $b" | bc)
echo "e=$e"

這里bc是bc命令箫措,scale是自帶的內建變量腹备,表示精確到小數點后幾位,|是管道的意思斤蔓,前面命令的輸出結果作為后面命令的輸入植酥,此處命令行輸出結果為:.2500

7. 內聯輸入重定向

f=$(bc << EOF
scale=4
temp=($a * $b)
temp / 4
EOF
)
echo "f=$f"

輸出結果為:100.0000

8. 命令執(zhí)行退出的狀態(tài)

0        成功
127   沒有找到命令
1       未知錯誤
126  命令不可執(zhí)行

查看上一次命令的執(zhí)行狀態(tài)

echo $?

在shell腳步中,自己指定退出的狀態(tài)

exit 狀態(tài)碼

只有if命令的退出狀態(tài)碼為0弦牡,才會執(zhí)行then部分

if  命令
then 
    命令
fi

舉個例子:

#!/bin/bash                                                                                                                                                            
testuser=zhangpan
if grep $testuser /usr
then
   echo "ok"
ls -a /usr/$testuser/
elif ls -d /usr/$testuser/
then
   echo "主目錄存在"
else
   echo "$testuser not exist"
fi

9. test數值比較

test命令的復雜寫法:

#!/bin/bash                                                                                                                                                            
#test命令友驮,如果條件成立,test命令以狀態(tài)為0退出驾锰,if條件成立
if test $var
then
echo "test條件成立"
else
echo "test條件不成立"
fi

test命令的簡單寫法:

#!/bin/bash                                                                                                                                                            
a=10
b=5
#test命令的簡單寫法[]
if [ $a -gt $b ]
then
   echo "$a more than $b"
else
   echo "$a smaller than $b"
fi

10. test字符串比較

11.test文件比較

#!/bin/bash                                                                                                                                                            
mydir=/usr/zhangpan
#-d檢查目錄是否存在
if [ -d $mydir ]
then
   echo "$mydir exist"
   ls $mydir
else
   echo "$mydir not exist"
fi

[ -d mydir ] :檢查/usr/zhangpan目錄是否存在卸留,lsmydir :將/usr/zhangpan目錄中的文件全部展示到控制臺,當然也可以先轉到目錄下椭豫,再展示:

cd $mydir
ls

其他的有關命令:

-d filename:如果filename為目錄耻瑟,則為真
-e filename:如果filename存在,則為真
-f filename:如果filename為常規(guī)文件赏酥,則為真
-r filename:如果filename可讀喳整,則為真
-w filename:如果filename可寫,則為真
-x filename:如果filename可執(zhí)行裸扶,則為真

12.多個條件

多個條件并列:

[] && []

例如:

#!/bin/bash                                                                                                                                                            
#多個條件
mydir=/usr/zhangpan
if [ -d $HOME ] && [ -w $mydir ]
then
   cd $mydir
   touch text.c
else
   echo "no such file"
fi

13.任意數學表達式或賦值

任意數學表達式或賦值用雙小括號

((數學表達式或賦值語句))

case命令

#!/bin/bash                                                                                                                                                            
testusr=zhangpan
case $testusr in
jack)
   echo "$testusr is exist";;
zhangpan)
   echo "$testusr is exist";;
*)
   echo "no usr is exist";;
esac

這個命令相信不用我做過多的介紹框都,大家就能明白其中的含義。
case命令的基本模式如下:

case var in
pattern1) 命令1;;
pattern2) 命令2;;
*) 默認命令;;
esac

for循環(huán)

#!/bin/bash                                                                                                                                                            
for item in Teacher Student Master
do
   echo $item
done

for命令的基本模式如下:

for var in list
do
  命令
done

如果集合中的元素有單引號或者雙引號姓言,可用轉義符號進行轉換,如雙引號轉義:

for item in Teacher\"s Student Master

集合可用list變量表示:

#!/bin/bash                                                                                                                                                            
list="Teacher Student Master"
for item in $list
do
  echo $item
done

上面集合的分隔符是空格蔗蹋,如果是逗號的話何荚,需要用IFS字段分隔符:

#!/bin/bash                                                                                                                                                            
list="Teacher,Student,Master"
IFS=$,
for item in $list
do
  echo $item
done

while循環(huán)

#!/bin/bash                                                                                                                                                            
a=10
while [ $a -gt 5 ]
do
  echo "$a"
  a=$[ $a - 1 ]
done

循環(huán)打印出10大于5的數,while循環(huán)的基本模式如下:

while test command
do
  命令
done
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末猪杭,一起剝皮案震驚了整個濱河市餐塘,隨后出現的幾起案子,更是在濱河造成了極大的恐慌皂吮,老刑警劉巖戒傻,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異蜂筹,居然都是意外死亡需纳,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門艺挪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來不翩,“玉大人,你說我怎么就攤上這事】隍穑” “怎么了器钟?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長妙蔗。 經常有香客問我傲霸,道長,這世上最難降的妖魔是什么眉反? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任昙啄,我火速辦了婚禮,結果婚禮上禁漓,老公的妹妹穿的比我還像新娘跟衅。我一直安慰自己,他們只是感情好播歼,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布伶跷。 她就那樣靜靜地躺著,像睡著了一般秘狞。 火紅的嫁衣襯著肌膚如雪叭莫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天烁试,我揣著相機與錄音雇初,去河邊找鬼。 笑死减响,一個胖子當著我的面吹牛靖诗,可吹牛的內容都是我干的。 我是一名探鬼主播支示,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼刊橘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了颂鸿?” 一聲冷哼從身側響起促绵,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嘴纺,沒想到半個月后败晴,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡栽渴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年尖坤,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闲擦。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡糖驴,死狀恐怖僚祷,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情贮缕,我是刑警寧澤辙谜,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站感昼,受9級特大地震影響装哆,放射性物質發(fā)生泄漏。R本人自食惡果不足惜定嗓,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一蜕琴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宵溅,春花似錦凌简、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寇损,卻和暖如春凸郑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背矛市。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工芙沥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浊吏。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓而昨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親找田。 傳聞我的和親對象是個殘疾皇子歌憨,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內容

  • .bat腳本基本命令語法 目錄 批處理的常見命令(未列舉的命令還比較多,請查閱幫助信息) 1午阵、REM 和 :: 2...
    慶慶慶慶慶閱讀 8,070評論 1 19
  • 基礎 頭文件 #!/bin/bash 或者#!/bin/sh #!約定的標記躺孝,如IOS的Import 執(zhí)行文件時需...
    ZMJun閱讀 1,229評論 1 2
  • 一享扔,shell題記 不懂shell的程序員不是好程序員底桂,學習shell是為了自動化,使用自動化可以非常有效的提高工...
    架構師小秘圈閱讀 8,722評論 3 70
  • 許久不見的S小姐冷不丁給我發(fā)了條微信 “我要離開了,該不該和那個人說一聲氛魁?” 我說:說你妹暮顺,你以為你在他眼里是個什...
    小山蕉閱讀 430評論 0 0
  • 喬邊故事閱讀 162評論 0 0