1.1 多命令;
shell
shell腳本能夠經過;將命令串起來一塊兒運行,甚至能夠將前一個命令執行的結果做爲參數傳給後一個命令執行。bash
[root@localhost ~]# 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 建立腳本文件ide
1.2.1 腳本文件必須以.sh後綴結尾ui
1.2.2 第一行必須指明shell,能夠是bash,也能夠是其餘shell
接口
#!/bin/bash
1.2.3 #後爲註釋內容,不會運行,能夠在指定shell之後添加腳本註釋,註明腳本用途
ip
#This script displays the date who's logged on
1.2.4 腳本必須給用戶加上執行權限才能夠運行;ssl
1.2.5 腳本運行方式:字符串
(1)能夠將腳本路徑導入到環境變量中;
input
(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腳本中引用環境變量,例如以下腳本
[root@localhost ~]# 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 [root@localhost ~]# chmod a+x test.sh [root@localhost ~]# ./test.sh This user UID is:0 The homedir is:/root
1.4.2 用戶變量
用戶變量賦值:var=變量值
在shell腳本中,變量複製之後僅在當前shell執行時生效,shell執行結束後,變量值失效
變量值還能夠引用其餘變量,例如:
[root@localhost ~]# vi test.sh #!/bin/bash var1=10 var2=$var1 echo 「var2的值爲$var1」 ~ ~ "test.sh" 4L, 61C written [root@localhost ~]# ./test.sh 「var2的值爲10」
1.4.3 命令替換
命令替換的方式有以下兩種:
var1=`date` :變量var1爲date命令的執行結果
[root@localhost ~]# var1=`date` [root@localhost ~]# echo $var1 Tue Jul 18 09:29:33 CST 2017
var2=$(date):同上
[root@localhost ~]# var2=$(date) [root@localhost ~]# echo $var2 Tue Jul 18 09:31:04 CST 2017 [root@localhost ~]#
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執行
[root@localhost ~]# wc <test1 1 5 36
COMMAND << EOF:<<爲內聯輸入重定向,能夠將當前輸入作出命令的參數,EOF爲退出符,可自定義其餘字符串做爲退出符。
[root@localhost ~]# wc << EOF > test1 > test2 > test3 > EOF 3 3 18
1.5 管道命令|
COMMAND | COMMAND |COMMAND:管道命令能夠將前一條命令執行的結果做爲參數傳給管道後一條命令執行。可使用多個管道
[root@localhost ~]# ls |wc 13 13 125
1.6 數學運算
1.6.1 expr命令:expr能夠執行數學運算
示例:
[root@localhost ~]# expr 1 + 5 6
expr可識別的命令操做符以下:
ARG1 | ARG2 :或運算,若是ARG1不是null值也不是0值則返回ARG1,反之則返回ARG2
[root@localhost ~]# expr 1 \| 2 1 [root@localhost ~]# 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 方括號運算$[]
示例:
[root@localhost ~]# var1=$[1+5] [root@localhost ~]# echo $var1 6
1.6.3 let運算表達式
示例:
[root@localhost ~]# let var1=1+2 [root@localhost ~]# echo $var1 3
1.6.4 $(())運算表達式
示例:
[root@localhost ~]# var=$((2+2)) [root@localhost ~]# echo $var 4
1.6.5 加強型賦值符
+= -= *= /= %=
[root@localhost ~]# let count+=1 [root@localhost ~]# echo $count 1 [root@localhost ~]# let count+=1 [root@localhost ~]# echo $count 2
1.6.7 自增自減
++:自增
--:自減
1.6.8 浮點運算
bc:浮點運算計算器,能夠進行浮點運算,使用 quit命令退出
[root@localhost ~]# 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:靜默模式,能夠省略提示信息
[root@localhost ~]# bc -q 5.5+6.342 11.842 quit
bc支持變量運算
[root@localhost ~]# bc -q var=10.123 var1=342.32 var+var1 352.443 quit
bc設置小數點有效位數:scale
[root@localhost ~]# bc -q 5/3 1 scale=3 5/3 1.666 quit
在腳本中使用bc,一般使用命令替換的方式:
[root@localhost ~]# var=$(echo "scale=4;5 / 3" | bc) [root@localhost ~]# echo $var 1.6666
[root@localhost ~]# 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 [root@localhost ~]# ./test.sh var is 3.333
在腳本中使用bc,還可使用內聯重定向的方式<<
[root@localhost ~]# 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 [root@localhost ~]# ./test.sh var5 is 4533.63
1.7 退出腳本
$?:能夠查看命令運行狀態,0表示命令運行正常,其餘數字則表示腳本運行錯誤。
[root@localhost ~]# echo $? 0 [root@localhost ~]# ssldkf bash: ssldkf: command not found... [root@localhost ~]# echo $? 127
常見的退出碼含義:
0 命令成功結束
1 通常性未知錯誤
2 不適合的shell命令
126 命令不可執行
127 沒找到命令
128 無效的退出參數
128+x 與Linux信號x相關的嚴重錯誤
130 經過Ctrl+C終止的命令
255 正常範圍以外的退出狀態碼
exit命令:能夠指定腳本結束時退出時的退出碼
[root@localhost ~]# 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 [root@localhost ~]# ./test.sh var5 is 4533.63 [root@localhost ~]# echo $? 10
經過上述示例可看出,腳本退出碼已被更改成10
退出碼還可使用變量表示,退出碼的範圍爲0-255,退出碼共計256位,若是指定的退出碼大於255,則退出碼會顯示取模值。
[root@localhost ~]# vi test.sh #!/bin/bash var1=10 var2=300 var3=$[ $var1 * $var2 ] echo "var3 is $var3" exit $var3 ~ ~ ~ ~ ~ "test.sh" 6L, 85C written [root@localhost ~]# ./test.sh var3 is 3000 [root@localhost ~]# echo $? 184