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目錄中的文件全部展示到控制臺,當然也可以先轉到目錄下椭豫,再展示:
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