從本節開始,正式進入shell腳本編輯。shell
若是想使用兩條命令同時運行,可使用 分號 隔開來執行;express
例如:date ; who編程
注意,這種方式下面,單條命令的最大字符數量不能超過255個字符;數組
#!/bin/bash
#在普通的shell腳本中,# 符號做爲註釋行,默認shell腳本不處理註釋行,可是第一行例外。這一行用來告訴系統,如下均爲shell程序命令;bash
#!/bin/bash #This script displays the date and who's logged on date who
在shell腳本中,程序執行都是按照順序由上至下的進行運行的;函數
若是想執行這個腳本程序,能夠將文件添加到PATH路徑中,或是使用全路徑來執行這個腳本程序;ui
第二種執行方式:this
chmod u+x test1 ./test1
大多數的shell命令生成本身的輸出,這些輸出在運行該腳本的控制檯監視器上輸出相應的信息,來幫助客戶知道發生了什麼事情;spa
#!/bin/bash #This script displays the date and who's logged on echo The time adn date are; date echo "Let's see who's logged into the system:" who
chmod u+x test1 ./test1
echo命令再輸出內容的時候默認在最後輸出一個回車,此時,爲了讓結果和文本字符串在同一行顯示,咱們使用 -n 參數來實現3d
echo -n "The time and date are:"
輸出結果以下:
在shell腳本中,咱們不是僅僅只處理命令,還須要加入變量,結合數據來實現對應的功能;
首先,在shell腳本中就能夠應用對應環境變量,經過set命令就能夠查看到;
#!/bin/bash #display user information from the system echo 「User info for userid:$USER」 echo UID: $UID echo HOME: $HOME
chmod u+x test2 ./test2
這樣的話,就會顯示當前用戶的UID和HOME目錄;
在shell腳本程序中,若是你須要使用符號自己的含義,是須要使用 \ 反斜線來還原符號自己的含義的
echo "The cost of th item is \$15"
除了系統自帶的環境變量,在shell腳本程序中,Linux系統是支持使用本身的定義的本地變量的;也就是用戶變量;
可是要注意,用戶變臉的字符不能操做20個字符字母、數字或者下劃線。變量名稱是區分大小寫的Var1和var1是不同的。而且經過等號,來給變量賦值;
var1=10 var2=-57 var3=testing var="still more testing"
用戶變量再shell腳本週期內生效,若是shell腳本執行結束,這個變量也隨之被刪除;
#!/bin/bash #testing variables days=10 guest="Katie" echo "$guset checked in $days days ago" days=5 guset="Jessica" echo "$guset checked in $days days ago"
chmod u+x test3 ./test3
腳本由上向下執行,變量從新複製都會覆蓋掉以前全部的值;
#!/bin/bash #assigning a variable value to another variable value1=10 value2=$value1 echo The resulting value is $value2
chmod u+x test4 ./test4
其中$value1值賦給value2的時候必須加上 $ 符號
反引號所引發來的內容,若是是命令,則會將命令的執行結果取出來,並賦值給對應的變量;
#!/bin/bash #using the backtick character testing=`date`echo "The date and time are:" $testing
chmod u+x test5 ./test5
此時,輸出的就是date這個內容,就是執行date命令所看到的內容
#!/bin/bash # copy th /usr/bin directory listing to a log file today=`date +%y%m%d` ls /usr/bin -al > log.$today
chmod u+x test6 ./test6
這樣就將ls /usr/bin -al 查看到的內容,複製給對應的目錄,且這個目錄後綴爲今天的時間,這個操做在真實的工做環境下是常用的;
有時候,咱們想保存命令的輸出,而不是顯示出來。bash shell提供了幾種操做符來實現;
command > outputfile
date > test6 ls -l test6
cat test6
who > test6 cat test6
若是是追加文件的話,咱們就須要使用 >>
date >> test6 cat test6
command < inputfile 它主要是將一個文件的內容重定向到一條命令中去;
wc < test6 #將test6這個文件交給wc來執行
wc命令:在wc命令下生成的三個值
文本的行數
文本的單詞書
文本的字節數
內置輸入重定向符號爲兩個小於號 <<;咱們須要指定一個文本標記來講明數據輸入的開始和結尾。文本標記可使用任意字符,可是開始和結尾必須相同
wc << EOF >test string 1 >test string 2 >test string 3 > EOF
command1 | command2 #將command1命令的結果輸出給command2來執行;
rpm -qa | sort | more
rpm -qa | sort > rpm.list #查看安裝的全部軟件,同時進行排序,並將結果輸入到rmp.list文件中
在shell腳本程序中,使用數學運算是必須的;
能夠經過expr來進行數學運算
expr 1+5
expr命令可以區分一些不一樣的數學操做符合字符串的操做符,以下表:
expr 5 \* 2 #對於有些符號,具備特定意義的,須要使用反斜線,恢復其自己意思;
#!/bin/bash # An example of using the expr command var1=10 var2=20 var3='expr $var2 / $var1' echo The result is $var3
chmod u+x test6 ./test6
($[operation])
var1=$[1 + 5]
echo $var1
var2=$[$var1 * 2]
echo $var2
與使用expr命令相比,使用括號使用shell數學運算變的更加簡單。
#!/bin/bash var1=100 var2=50 var3=45 var4=$[$var1 * ($var2 - $var3)] echo The final result is $var4
chmod u+x test7 ./test7
使用括號的方式來進行算數運算,無需小心符號錯誤;
#!/bin/bash var1=100 var2=45 var3=$[$var1 / $var2] echo The final result is $var3
chmod u+x test8 ./test8
上面運行腳本的結果爲2,是一個整形,這裏屬於數據類型的結果,正確狀況下須要回覆一個浮點數據纔是正確的;
解決浮點運算問題最簡單的方式就是使用bc計算器;
一、bc的基礎知識
bash計算器能夠識別的數據類型:一、數字(包括整數和浮點);二、變量(簡單變量和數組);三、註釋(以英鎊符號開始的行或者C育嬰的/* */對);四、表達式;五、編程語句(如if-then語句);六、函數;
bc 12 * t.4 3.156 * (3 + 5) quit
scale參數控制浮點計算後支持幾位數值:
bc -q 3.44 / 5 scale=4 3.44 / 5
或者則會像是小數點後4爲,這就是經過scale參數來控制的;
同時,在bc計算器中,也可使用變量來進行勻速昂;
bc -q var1=10 var1 * 4 var2 = var1 / 5 print var2 quit
二、在腳本中使用bc
在shell腳本中使用bc計算器,來進行浮點計算;
用法:variable=`echo "options; expression" | bc`
#!/bin/bash var1=`echo " scale=4; 3.44 / 5" | bc` echo The answer is $var1
chmod u+x test9 ./test9
爲了避免再受到數字的限制,咱們使用變量來實現運算
#!/bin/bash var1=100 var2=45 var3=`echo "scale=4; $var1 / $var2" | bc` echo The answer for this is $var3
chmod u+x test10 ./test10
固然,若是繼續賦值了的話,能夠再給其餘的運行式進行運算
#!/bin/bash var1=20 var2=3.14159 var3=`echo "scale=4; $var1 * $var2" | bc` var4=`echo "scale=4; $var3 * $var2" | bc` echo The final result is $var4
對於簡短的計算這種方法很好,可是有時數字多了,就會顯示的很混亂;
這個問題有個簡單的解決方法。bc命令可以是被輸入重定向,允許把文件重定向到bc命令中進行處理。然而,這一樣容易混淆,由於須要在文件中存儲表達式;
還可使用內置輸入重定向的方式,而不是用文件重定向。在shell中,能夠把輸出賦值給變量。以下:
variable=`bc << EOF
options
statements
expressions
EOF
`
EOF文本字符串代表內置重定向數據的開始和末尾。記住任然須要使用反引號將bc命令輸出的值賦給變量。
如今能夠把全部單獨的bash計算器元素放到腳本的單獨行中。
#!/bin/bash var1=10.46 var2=43.67 var3=33.2 var4=71 var5=`bc << EOF scale = 4 a1 = ( $var1 + $var2 ) b1 = ( $var3 * $var4 ) a1 + b1 EOF ` echo The final answer for this mess is $var5
shell腳本中的命令都是使用一個退出狀態。這個退出狀態介於0和255之間的整數值,當命令運行完成使,命令就會把退出狀態傳遞給shell。能夠捕捉這個值並在您的腳本中使用它。
$? 特殊變量輸出最後一條命令執行的轉態。若是向覈對上一條命令的執行狀態,須要在這條命令後直接 echo $?;
date echo $?
若果是錯誤的狀態,則會放回非0的結果
afdas echo $?
常見的返回狀態:
0 #命令執行成功
1 #未知的錯誤
2 #誤用shell命令
126 #命令沒法執行
127 #沒有找到命令
128 #無效的退出參數
128+x #使用Linux信號x的致命錯誤
130 #使用ctrl+c終止的命令
255 #規範外的退出轉態
~]#./myprog.c -bash: ./myprog.c:Permission denied ~]#echo $? 126
~]#date %t date: invalid date '%t' ~]#echo $? 1
指定一個腳本的退出狀態
#!/bin/bash #testing the exit status var1=10 var2=30 var3=$[ $var1 + $var2 ] echo The answer is $var3 exit 5
chmod u+x test13 ./test13 echo $?
這樣的話,去檢查腳本的退出狀態碼就不是默認的0了,而是最後咱們指定的5;
同時退出轉態碼,也可使用變量
#!/bin/bash #testing the exit status var1=10 var2=30 var3=$[ $var1 + $var2 ] exit $var3
這樣,退回的轉態碼就是$var3的值;
應該謹慎使用退出狀態碼,由於退出狀態碼最高是255。若是超出這個範圍,運算結果就是那個特定的書被256除了以後的餘數。
在if-then語句中,退出狀態碼尤爲重要;