shell是用C語言編寫的程序,爲用戶與Linux之間的橋樑。可是,本篇文章中的shell是指shell腳本語言。java
話很少說,先上個例子。腳本 test.sh 以下:shell
#!/bin/bash
#打印出Hello,World
echo "Hello,World"
說明1. #! 是一個約定的標記,用來告訴系統該腳本須要什麼解釋器來執行,如 #!/bin/sh #!/bin/bash數組
說明2. 第二行是註釋,shell中的註釋使用 #bash
執行shell腳本的兩種方法:數據結構
1. 可執行程序函數
chmod +x ./test.sh #使腳本具備執行權限測試
./test.sh #執行腳本spa
2. 做爲解釋器參數執行unix
/bin/sh test.sh (能夠簡寫爲 sh test.sh)code
2、shell變量
2.1 shell變量命名規則
1)只能用英文字母、數字和下劃線,且首字母不能以數字開頭;
2)中間不能有空格、標點符號等其餘符號;
3)不能使用bash的保留關鍵字
2.2 shell變量定義和使用
定義語法: varname=值
注意: =號先後不能有空格
使用變量語法: $varname
也可使用 ${varname} , {} 爲可選項,界定變量名邊界
2.3 只讀變量
使用 readonly 命令修飾的變量,值不可變,稱只讀變量。如
readonly varname="test.sh"
2.4 刪除變量
使用 unset 命令能夠刪除非只讀變量。如
varname=11
unset varname
2.5 shell中同時存在三種變量
1) 局部變量
2)環境變量
3)shell變量
3、shell中數據結構
3.1 字符串
1)可使用單引號、雙引號,也能夠不使用引號
單引號:1.包含的字符串會原樣輸出;2.包含的字符串不能出現單獨一個單引號
雙引號:1.包含的字符串能夠出現變量;2.能夠有轉義符
2)定義一個字符串: str=abcd
3)獲取字符串的長度: ${#str}
4)提取子字符串: ${#str:first:length} #從first位置起截取length長度的字符串
5)查找子字符串: `expr index "$str" io` #使用反引號`
3.2 shell數組
shell只支持一維數組,而且不限定數組的大小,數組的下標是從0開始的,下標能夠是整數或算術表達式,其值應該大於或者等於0.
1)數組的定義: shell中使用括號()定義數組,元素之間用「空格」分隔,語法以下
array_name=(value0 value1 value2 ......... valueN)
也可使用下標來定義: array_name[下標]=value
2)讀取數組 語法: ${array_name[下標]} #下標爲@或者*表示全部元素
3)獲取數組長度: 與獲取字符串長度的方法相同
獲取數組元素個數: ${#array_name[@]} 或者 ${#array_name[*]}
獲取單個元素的長度: ${#array_name[下標]}
4、shell註釋
單行註釋: #
多行註釋: :<<EOF
.........
.........
EOF
或者
:<<!
...............
...............
!
5、shell基本運算符
包括 算數運算符、關係運算符、布爾運算符、字符串運算符、文件測試運算符。
5.1 算數運算符
原生Bash不支持簡單的數字運算,但可使用其餘命令實現,如awk和expr,其中expr最經常使用
例如: val=`expr 2 + 2`
注意1:表達式和運算符之間必須有空格;
注意2:必須使用``(反引號)包含
算數運算符及其說明和舉例
+ : 加法, `expr $a + $b`
- : 減法
* : 乘法
/ : 除法
% : 取餘
= : 賦值, a=$b
== : 相等, [$a == $b]
!= : 不相等
5.2 關係運算符
只支持數字和值爲數字的字符串
關係運算符及其說明和舉例
-eq : 是否相等, [$a -eq $b]
-nq : 是否不相等, [$a -nq $b]
-gt : 大於, [$a -gt $b]
-lt : 小於, [$a -lt $b]
-ge : 大於等於, [$a -ge $b]
-le : 小於等於, [$a -le $b]
5.3 布爾運算符
布爾運算符及其說明和舉例
! : 非, [!false]
-o : 或,[$a -lt 20 -o $b -gt 100]
-a : 與,[$a -lt 20 -a $b -gt 100]
5.4 邏輯運算符
邏輯運算符及其說明和舉例
&& : 邏輯的AND, [[$a -lt 20 && $b -gt 100]]
|| : 邏輯的OR,[[$a -lt 20 || $b -gt 100]]
5.5 字符串運算符
字符串運算符及其說明和舉例
= : 是否相等,相等爲true, [ $a = $b ]
!= : 是否不相等,不相等爲true, [ $a != $b ]
-z : 長度是否爲0,0爲true, [ -z $a ]
-n : 長度是否爲0,不爲0爲true, [ -n $a ]
: 是否爲空,不爲空返回true, [ $a ]
5.6 文件測試運算符
用於檢測unix文件的各類屬性
文件測試運算符及其說明和舉例
-b file : 檢測文件是不是塊設備文件,是返回true, [ -b file ]
-c file : 是不是字符設備文件,是返回true
-d file : 是不是目錄,是返回true
-f file : 是不是普通文件,是返回true
-g file : 是否設置了SGID位,是返回true
-k file : 是否設置了粘着位(sticky Bit),是返回true
-p file : 是不是有名管道,是返回true
-u file : 是否設置了SUID位,是返回true
-r file : 文件是否可讀,是返回true
-w file : 文件是否可寫,是返回true
-x file : 文件是否可執行,是返回true
-s file : 文件是否爲空,不爲空返回true
-e file : 文件(目錄)是否存在,是返回true
5.7 test命令
用於檢查某個條件是否成立,能夠進行數值、字符和文件三個方面的測試。與上面的「關係運算符」、「字符串運算符」、「文件測試運算符」相同,只是寫法上不一樣。
test命令寫法以下:
test ${num1} -eq ${num2}
6、shell打印命令
shell打印命令有 echo 和 printf
6.1 shell echo命令
用於字符串的輸出,格式 : echo str
顯示普通字符串: echo "It is a test"
顯示轉移字符: echo "\"It is a test\""
顯示變量: echo $str
開啓轉義: echo -e "OK! \n" #換行
echo -e "OK! \c" #不換行
單引號'' 與 雙引號"" 的區別
單引號:原樣輸出;雙引號:變量、轉義符等均生效。
顯示命令執行結果: echo `date` #注意是反引號
echo總結
名稱 | 可否引用變量 | 可否引用轉義符 | 可否引用文本格式符(換行、製表等符號)
單引號 | 否 | 否 | 否
雙引號 | 能 | 能 | 能
無引號 | 能 | 能 | 否
6.2 printf 命令
相較於 echo ,printf 具備很好的移植性,可是printf不會自動添加換行符,須要手動添加 \n
printf命令的語法: printf format-string [arguments ......]
說明1: format-string 格式控制字符串
說明2: arguments 參數列表
例如: printf "%-10s %-8s %-4s \n" 姓名 性別 體重kg
printf格式替換符: %d %s %c %f
d : Decimal 十進制整數
s : String 字符串
c : char 字符
f : Float 浮點數
printf的轉義序列:
\a : 警告字符;
\b : 後退
\c :
\f : 換頁
\n : 換行
\r : 回車
\t : 水平製表符
\v : 垂直製表符
\\ : 一個字面上的反斜槓字符
\ddd : 表示 1 到 3 位數八進制值的字符,僅在格式字符串中有效
\0ddd : 表示 1 到 3 位的八進制值字符
7、read 命令
read命令從標準輸入中讀取一行,並把輸入行的每一個字段的值指定給shell變量。read命令一個一個詞組地接收輸入的參數,之間用空格分隔,輸入的詞大於須要參數的個數,則最後多餘的會成一個總體
read 參數說明:
-p : 輸入提示文字
-n : 輸入字符長度限制
-t : 輸入限時
-s : 隱藏輸入內容
8、shell流程控制
首先聲明一點,shell控制流中不能爲空。
8.1 if
格式:
if condition
then
command1
...........
commandn
fi
8.2 if else
格式:
if condition
then
command1
..........
commandn
else
command1
..........
commandn
fi
8.3 if else-if else
格式:
if condition
then
command1
.........
commandn
elif condition
then
command1
.........
commandn
.........
.........
else
command1
..........
commandn
fi
8.4 for循環
格式:
for var in 列表
do
command1
..........
commandn
done
或者
for((assignment; condition; next))
do
command1
.........
commandn
done
8.5 while結構
格式:
while condition
do
command1
...........
commadn
done
8.6 無限循環
格式:
while :
do
command1
..........
commandn
done
或者
while true
do
command1
........
commandn
done
或者
for((;;))
do
command1
..........
commandn
done
8.7 until循環
until循環只有條件爲fasle才執行,條件爲true則終止執行。與while恰好相反。
格式:
until condition
do
command1
............
commandn
done
8.8 shell中的break 和 continue
用於退出循環,用法跟java語言中相同。
8.9 case多選擇語句
匹配一個值與一個模式,若是匹配成功,執行相匹配的命令
格式:
case 值 in
模式1)
command1
...........
commandn
模式2)
command1
...........
commandn
..............
..............
模式n)
command1
...........
commandn
*)
command1
...........
commandn
esac
9、shell函數
格式:
[function] funname[()]
{
astion;
[return int;]
}
注意:1. 調用函數時直接使用函數名 funname;2. return後跟數值;若是沒有顯示return則將最後一條命令的運行結果做爲返回值;3. 調用函數以後,用 $? 來獲取函數返回值;4. 函數調用必須在使用後;5. 可使用函數傳參,函數中獲取參數的方式爲 $n (n >= 1,且n < 10時能夠省去{})。
10、shell傳遞參數
執行shell腳本或者調用shell函數時,能夠向腳本或者函數傳遞參數。
在腳本中使用 $n 獲取參數,$n 表示第n個參數,其中 n 爲大於0的整數。
10.1 特殊參數
$0 : 所執行腳本的文件名;
$# : 傳遞到腳本的參數個數;
$* : 以一個單字符串顯示全部向腳本傳遞的參數;
$$ : 腳本運行的當前進程ID號;
$! : 後臺運行的最後一個進程的ID號;
$@ : 與 $* 相同,可是使用時加引號,並在引號中返回每一個參數;
$- : 顯示shell使用的當前選項;
$? : 顯示最後命令的退出狀態,0表示正確退出,其餘值表示錯誤。
10.2 $* 與 $@ 區別
相同點: 都是引用全部參數;
不一樣點: 只有在雙引號中體現出來, * 號: "1 2 3", @: "1" "2" "3"
11、shell輸入/輸出重定向
標準輸入/標準輸出 : 默認輸入/輸出爲終端
重定向命令列表以下:
命令 | 說明
command > filename | 將輸出重定向到filename
command < filename | 將輸入重定向到fielname
command >> filename | 將輸出以追加的方式重定向到filename
n > filename | 將文件描述符爲n的文件重定向到filename
n >> filename | 將文件描述符爲n的文件以追加的方式重定向到filename
n >& m | 將輸出文件m 和 n合併
n <& m | 將輸入文件m 和 n合併
<< tag | 將開始標記tag和結束標記tag之間的內容做爲輸入
n的取值: 0 (標準輸入); 1 (標準輸出); 2 (標準錯誤輸出)
11.1 Here Document
shell中的一種特殊的重定向方式,用來將輸入重定向到一個交互式shell腳本或程序
格式:
command << delimiter
document
delimiter
做用是將兩個delimiter之間的內容document做爲輸入傳遞給command
注意:結尾的delimiter先後不能有任意的其餘字符
例如:
cat << EOF
"It is a test"
EOF
11.2 /dev/null 文件
寫入該文件中內容會被丟棄;從該文件中也讀不出任何內容。
12、shell文件包含
shell能夠包含外部的腳本。
格式:
. filename #注意點號(.)和文件名中間有一個空格
或者
source filename
注意:被包含的文件不須要可執行權限。