腳本運行環境爲Centos7java
shell 腳本的第一行用來指定要使用的shell 格式爲python
#!/bin/bash
一般使用# 做爲shell 腳本的註釋(可是第一行例外)
建立一個內容以下的腳本(文件名.sh結尾)shell
#!/bin/bash/ #腳本測試 date who
完成後直接運行,使用命令bash 文件名.sh能夠直接運行腳本,獲得以下結果:編程
Sun Jun 17 20:52:35 CST 2018
root pts/0 2018-06-17 20:49
上面就是一個簡單的腳本bash
大多數shell命令都會產生本身的輸出,這些輸出會輸出到控制檯上,不少時候咱們想添加本身的文本消息來告訴用戶腳本正在作什麼,這就用到了一個shell 命令 echo學習
echo 可使用單引號或者雙引號來劃定按文本字符串,做用相似於java/python的print
能夠把上面的腳本改成測試
#!/bin/bash/ #腳本測試 echo "如今的時間是" date echo "已經登陸的用戶有" who
能夠看到結果:ui
如今的時間是
Mon Jun 18 08:16:10 CST 2018
已經登陸的用戶有
root pts/0 2018-06-18 08:15
以前使用過echo 命令來查看環境變量 一樣,也能夠在腳本中使用$+環境變量名來獲取環境變量
修改腳本爲this
#!/bin/bash/ #腳本測試 echo "如今的時間是" date echo "已經登陸的用戶有" who echo UID:$UID echo HOME:$HOME
執行後輸出以下 :命令行
如今的時間是
Mon Jun 18 08:36:09 CST 2018
已經登陸的用戶有
root pts/0 2018-06-18 08:15
root pts/1 2018-06-18 08:35
UID:0
HOME:/root
在shell腳本中只要引用了環境變量,就會顯示對應的環境變量,若是要顯示$HOME這樣的字符,必須在使用前加轉義符,不然會被shell翻譯爲對應的環境變量的值
shell腳本容許腳本中自定義變量,自定義的變量容許在整個腳本中使用
用戶變量能夠是任何由字母、數字或下劃線組成的文本字符串,長度不超過20個。用戶變量區分大小寫,因此變量Var1和變量var1是不一樣的
建立腳本內容以下 :
#!/bin/bash/ var1=10 var2=29 var3=$var1 echo 'var1的值爲$var1' echo 'var2的值爲$var2' echo 'var3的值和var1相等值爲$var3'
運行結果:
var1的值爲$var1
var2的值爲$var2
var3的值和var1相等值爲$var3
上面看到輸出內容不對啊,沒有拿到對應的值,這裏是個人引號寫錯了,echo中有變量調用的時候應該使用雙引號,不然沒法識別變量的值,或者不使用引號
將上面的腳本修改成:
#!/bin/bash/ var1=10 var2=29 var3=$var1 echo "var1的值爲$var1" echo "var2的值爲$var2" echo "var3的值和var1相等值爲$var3"
執行結果:
var1的值爲10
var2的值爲29
var3的值和var1相等值爲10
注意變量之間的賦值用的是var3=$var1而不是var3=var1,後者var3的值就是var1這個字符串了
命令替換就是將一個命令的輸出替換爲腳本中的一個變量,通常有兩種方法:
反引號字符 ` 例:var1=`date`$() 例 var2=$(date)
上面兩種都是將date輸出的內容賦值給變量var1/2,注意賦值等號和命令之間沒有空格
寫個腳本測試一下
#!/bin/bash/ var1=`date` var2=$(date) echo "今天的日期時間1是$var1" echo "今天的日期時間2是$var2"
運行結果:
今天的日期時間1是Mon Jun 18 10:53:39 CST 2018
今天的日期時間2是Mon Jun 18 10:53:39 CST 2018
經常使用下面的腳原本按日期給文件命名
#!/bin/bash # copy the /usr/bin directory listing to a log file today=$(date +%y%m%d) ls /usr/bin -al > log.$today
第三行是將date格式化爲年月日的形式,將/usr/bin/目錄下ls命令的輸出內容輸入到log文件中,運行後會生成一個以日期結尾的文件
最基本的重定向將命令的輸出發送到一個文件中。bash shell用大於號(>)
最簡單的執行命令
date > today
把今天的日期輸出到today文件中 注:today文件不存在於當前目錄下就會建立today文件,若是已經存在today文件,則會覆蓋today中的內容(沒有任何提示)
爲了防止覆蓋文件內容,可使用雙大於號 >> 來向文件追加內容
和輸出重定向相反,輸入重定向是使用 小於號 <
能夠把符號方向理解爲數據流動的方向
wc命令能夠對數據數據中的文本進行計數,默認狀況下會依次輸出三個值,分別爲:文本的行數,文本的詞數,文本的字節數
執行
wc < today
1 6 29
內聯輸入重定向符號是遠小於號(<<)。除了這個符號,你必須指定一個文本標記來劃分輸入數據的開始和結尾。任何字符串均可做爲文本標記,但在數據的開始和結尾文本標記必須一致
執行
wc << biaoji
會進入次級提示符中(理解爲一個輸入框),輸入對應的數據後換行輸入 biaoji 便可結束,並計算兩個biaoji之間的數據的信息 整體代碼以下
wc << biaoji >這裏是輸入的數據內容 >這也算 >biaoji
執行結果爲
2 2 41
管道命令格式 command1 | command2
將命令1的輸出做爲命令2的輸入
rpm -qa|sort >rmp.list
上面的命令就是將安裝包的信息排序後輸入到rpm.list中 (RedHat)
管道命令用處不少也很簡單
expr 1 + 5
加號兩邊都有空格
通常狀況不用這玩意兒,很難用,這個命令是bash shell爲了兼容另外一種名爲Bourne shell,因此就不要用了
使用$[operation] 做爲計算的首選
建立以下腳本
#!/bin/bash var1=100 var2=50 var3=45 var4=$[$var1 * ($var2 - $var3)] echo The final result is $var4
執行上面的腳本能夠看到The final result is 500
注意 bash shell 只支持整數運算
常見的浮點計算是使用內建的bash計算器
使用命令bc 進入計算器或者bc -q 略去歡迎信息
bc能夠指定結果的小數位數
$ bc -q 3.44 / 5 0 scale=4 3.44 / 5 .6880 quit
一樣bc 支持變量
$ bc -q var1=10 var1 * 4 40 var2 = var1 / 5 print var2 2 quit
在腳本中可使用bc
#!/bin/bash var1=$(echo "scale=4; 3.44 / 5" | bc) echo The answer is $var1
腳本bc+內聯輸入重定向
#!/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
查看退出狀態碼
echo $?
一個成功結束的命令的退出狀態碼是0.若是一個命令結束有錯誤,退出狀態碼應該是一個正數值
Linux 退出狀態碼
狀態碼 | 描述 |
---|---|
0 | 命令成功結束 |
1 | 通常性未知錯誤 |
2 | 不是的shell命令 |
126 | 命令不可執行 |
127 | 沒有找到命令 |
130 | 經過ctrl+c終止的命令 |
默認狀況下,shell腳本會以腳本中的最後一個命令的退出狀態碼退出。
exit命令容許你在腳本結束時指定一個退出狀態碼。
狀態嗎最大爲255 若是超過最大的狀態碼,退出狀態碼被縮減到了0~255的區間。shell經過模運算獲得這個結果。一個值的模就是被除後的餘數。最終的結果是指定的數值除以256後獲得的餘數。在這個例子中,指定的值是300(返回值),餘數是44,所以這個餘數就成了最後的狀態退出碼。
#!/bin/bash # testing the exit status var1=10 var2=30 var3=$[$var1 * $var2] echo The value is $var3 exit $var3
執行上面的腳本,其執行的狀態碼爲300,超過了最大的255,因此會被取餘爲44
使用命令
echo $?
能夠直接查看狀態碼 完~