構建基本腳本(第十一章)
1.1 多命令;
shell腳本可以通過;將命令串起來一起運行,甚至可以將前一個命令執行的結果作為參數傳給後一個命令執行。
[[email protected] ~]# date;who Mon Jul 17 20:46:33 CST 2017 (unknown) :0 2017-07-14 11:10 (:0) root pts/0 2017-07-17 13:08 (192.168.186.1) root pts/1 2017-07-17 20:40 (192.168.186.1)
1.2 創建腳本文件
1.2.1 腳本文件必須以.sh後綴結尾
1.2.2 第一行必須指明shell,可以是bash,也可以是其他shell
#!/bin/bash
1.2.3 #後為註釋內容,不會運行,可以在指定shell以後添加腳本註釋,註明腳本用途
#This script displays the date who‘s logged on
1.2.4 腳本必須給用戶加上執行權限才可以運行;
1.2.5 腳本運行方式:
(1)可以將腳本路徑導入到環境變量中;
(2)輸入腳本的完整路徑運行;
(3)在腳本路徑下使用./shell.sh運行腳本
1.2.6 環境變量導入方法
(1)可以通過PATH=$PATH:腳本路徑臨時導入
(2)在/etc/profile.d/路徑下創建一個.sh的文件,輸入PATH=$PATH:腳本路徑,每次開機時會自動讀取新增的環境變量;
(3)有些發行版環境變量中有$HOME/bin,只要在家目錄下創建bin目錄,將shell腳本放入bin目錄中
1.3 顯示消息echo命令
echo命令可以將輸入的內容打印到屏幕上,如果輸入的內容中包含‘號,需要使用“”將輸入內容引起來。-n選項可以忽略換行符。有些特殊符號需要使用/轉義
1.4 使用變量
1.4.1 環境變量,可以直接在shell腳本中引用環境變量,例如如下腳本
[[email protected] ~]# vi test.sh #!/bin/bash #This script displays the environment variable echo "This user UID is:$UID" echo The homedir is:$HOME ~ ~ "test.sh" [New] 4L, 114C written [[email protected]
1.4.2 用戶變量
用戶變量賦值:var=變量值
在shell腳本中,變量復制以後僅在當前shell執行時生效,shell執行結束後,變量值失效
變量值還可以引用其他變量,例如:
[[email protected] ~]# vi test.sh #!/bin/bash var1=10 var2=$var1 echo “var2的值為$var1” ~ ~ "test.sh" 4L, 61C written [[email protected] ~]# ./test.sh “var2的值為10”
1.4.3 命令替換
命令替換的方式有如下兩種:
var1=`date` :變量var1為date命令的執行結果
[[email protected] ~]# var1=`date` [[email protected] ~]# echo $var1 Tue Jul 18 09:29:33 CST 2017
var2=$(date):同上
[[email protected] ~]# var2=$(date) [[email protected] ~]# echo $var2 Tue Jul 18 09:31:04 CST 2017 [[email protected] ~]#
1.4.4 輸入輸出重定向
輸出重定向:
>:輸出覆蓋重定向,會將內容覆蓋重定向的內容或文件
>>:輸出追加重定向,會將內容追加到重定向的內容後或文件中
參數:
set -C:禁止將內容覆蓋已有的文件中
>|:強制覆蓋
set +C:允許覆蓋,一般默認為此項
2>:命令執行報錯則會將錯誤信息重定向覆蓋到指定文件中
2>>:命令執行報錯則會將錯誤信息重定向追加到指定文件中
COMMAND >/PATH/FILENAME1 2>/PATH/FILENAME2 :將命令正確和錯誤的輸出接口重定向覆蓋至不同路徑,使用2>、2>>追加同樣適用
COMMAND &> /PATH/FILENAME 將正確和錯誤的信息都覆蓋到同一個文件中,使用&>>可追加到同一個文件中。
COMMAND >/PATH/FILENAME &1 效果同上,使用追加同樣適用。
輸入重定向:<
COMMAND < input:可以將輸入作為參數傳遞給COMMAND執行
[[email protected] ~]# wc <test1 1 5 36
COMMAND << EOF:<<為內聯輸入重定向,可以將當前輸入做出命令的參數,EOF為退出符,可自定義其他字符串作為退出符。
[[email protected] ~]# wc << EOF > test1 > test2 > test3 > EOF 3 3 18
1.5 管道命令|
COMMAND | COMMAND |COMMAND:管道命令可以將前一條命令執行的結果作為參數傳給管道後一條命令執行。可以使用多個管道
[[email protected] ~]# ls |wc 13 13 125
1.6 數學運算
1.6.1 expr命令:expr可以執行數學運算
示例:
[[email protected] ~]# expr 1 + 5 6
expr可識別的命令操作符如下:
ARG1 | ARG2 :或運算,如果ARG1不是null值也不是0值則返回ARG1,反之則返回ARG2
[[email protected] ~]# expr 1 \| 2 1 [[email protected] ~]# expr 0 \| 2 2
ARG1 | ARG2:與預算,如果參數沒有null值或0值則返回ARG1,否則返回0
ARG1 < ARG2 如果ARG1小於ARG2,返回1;否則返回0
ARG1 <= ARG2 如果ARG1小於或等於ARG2,返回1;否則返回0
ARG1 = ARG2 如果ARG1等於ARG2,返回1;否則返回0
ARG1 != ARG2 如果ARG1不等於ARG2,返回1;否則返回0
ARG1 >= ARG2 如果ARG1大於或等於ARG2,返回1;否則返回0
ARG1 > ARG2 如果ARG1大於ARG2,返回1;否則返回0
ARG1 + ARG2 返回ARG1和ARG2的算術運算和
ARG1 - ARG2 返回ARG1和ARG2的算術運算差
ARG1 * ARG2 返回ARG1和ARG2的算術乘積
ARG1 / ARG2 返回ARG1被ARG2除的算術商
ARG1 % ARG2 返回ARG1被ARG2除的算術余數
STRING : REGEXP 如果REGEXP匹配到了STRING中的某個模式,返回該模式匹配
match STRING REGEXP 如果REGEXP匹配到了STRING中的某個模式,返回該模式匹配
substr STRING POS LENGTH 返回起始位置為POS(從1開始計數)、長度為LENGTH個字符的子字符串
index STRING CHARS 返回在STRING中找到CHARS字符串的位置;否則,返回0
length STRING 返回字符串STRING的數值長度
+ TOKEN 將TOKEN解釋成字符串,即使是個關鍵字
(EXPRESSION) 返回EXPRESSION的值
1.6.2 方括號運算$[]
示例:
[[email protected] ~]# var1=$[1+5] [[email protected] ~]# echo $var1 6
1.6.3 let運算表達式
示例:
[[email protected] ~]# let var1=1+2 [[email protected] ~]# echo $var1 3
1.6.4 $(())運算表達式
示例:
[[email protected] ~]# var=$((2+2)) [[email protected] ~]# echo $var 4
1.6.5 增強型賦值符
+= -= *= /= %=
[[email protected] ~]# let count+=1 [[email protected] ~]# echo $count 1 [[email protected] ~]# let count+=1 [[email protected] ~]# echo $count 2
1.6.7 自增自減
++:自增
--:自減
1.6.8 浮點運算
bc:浮點運算計算器,可以進行浮點運算,使用 quit命令退出
[[email protected] ~]# bc bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty‘. 1.1+1.2 2.3 quit
bc -q:靜默模式,可以省略提示信息
[[email protected] ~]# bc -q 5.5+6.342 11.842 quit
bc支持變量運算
[[email protected] ~]# bc -q var=10.123 var1=342.32 var+var1 352.443 quit
bc設置小數點有效位數:scale
[[email protected] ~]# bc -q 5/3 1 scale=3 5/3 1.666 quit
在腳本中使用bc,通常使用命令替換的方式:
[[email protected] ~]# var=$(echo "scale=4;5 / 3" | bc) [[email protected] ~]# echo $var 1.6666
[[email protected] ~]# vi test.sh #!/bin/bash var1=10 var2=3 var=$(echo "scale=3;$var1/$var2"|bc) echo "var is $var" ~ ~ ~ "test.sh" 5L, 83C written [[email protected] ~]# ./test.sh var is 3.333
在腳本中使用bc,還可以使用內聯重定向的方式<<
[[email protected] ~]# vi test.sh #!/bin/bash var1=10.11 var2=13.453 var3=100.3212 var4=3234 var5=$(bc<<EOF scale=2 a1=($var1*$var2) a2=($var3/$var4) a1/a2 EOF ) echo "var5 is $var5" ~ ~ ~ ~ "test.sh" 13L, 149C written [[email protected] ~]# ./test.sh var5 is 4533.63
1.7 退出腳本
$?:可以查看命令運行狀態,0表示命令運行正常,其他數字則表示腳本運行錯誤。
[[email protected] ~]# echo $? 0 [[email protected] ~]# ssldkf bash: ssldkf: command not found... [[email protected] ~]# echo $? 127
常見的退出碼含義:
0 命令成功結束
1 一般性未知錯誤
2 不適合的shell命令
126 命令不可執行
127 沒找到命令
128 無效的退出參數
128+x 與Linux信號x相關的嚴重錯誤
130 通過Ctrl+C終止的命令
255 正常範圍之外的退出狀態碼
exit命令:可以指定腳本結束時退出時的退出碼
[[email protected] ~]# vi test.sh #!/bin/bash var1=10.11 var2=13.453 var3=100.3212 var4=3234 var5=$(bc<<EOF scale=2 a1=($var1*$var2) a2=($var3/$var4) a1/a2 EOF ) echo "var5 is $var5" exit 10 ~ ~ ~ ~ "test.sh" 14L, 157C written [[email protected] ~]# ./test.sh var5 is 4533.63 [[email protected] ~]# echo $? 10
通過上述示例可看出,腳本退出碼已被更改為10
退出碼還可以使用變量表示,退出碼的範圍為0-255,退出碼共計256位,如果指定的退出碼大於255,則退出碼會顯示取模值。
[[email protected] ~]# vi test.sh #!/bin/bash var1=10 var2=300 var3=$[ $var1 * $var2 ] echo "var3 is $var3" exit $var3 ~ ~ ~ ~ ~ "test.sh" 6L, 85C written [[email protected] ~]# ./test.sh var3 is 3000 [[email protected] ~]# echo $? 184
本文出自 “學海無涯” 博客,謝絕轉載!
構建基本腳本(第十一章)