1. 概述
Shell 是一個使用C語言的程序, 是用戶使用 Linux 的橋梁, Shell 是一種命令語言.
- Shell 腳本
Shell 腳本(shell script)是一種為 shell 編寫的腳本程序.
Shell 編程和Java, PHP 一樣, 只要有一個可編寫的文本編輯器和能解釋執(zhí)行腳本解釋器可以了. - shell 種類
- Bourne Shell (/usr/bin/sh)
- Bourne Again Shell (bin/bash)
- C Shell (/usr/bin/csh)
- K Shell (/usr/bin/ksh)
- Shell for Root (/sbin/sh)
- 運行Shell 腳本有兩種方法
- 作為可執(zhí)行程序
# chmod +x ./a.sh
# ./a.sh
- 作為解釋器的參數(shù)
- shell 腳本頭部分添加
#!/bin/bash
- 執(zhí)行
# /bin/bash a.sh
2. Shell 變量
2.1 shell 變量定義
- 變量名和等號之間不可以不可以有空格,
- 變量名
- 命名只可以使用英文字母, 數(shù)字, 下劃線, 首個字符不可以為數(shù)字
- 中間不可以使用空格, 可以使用下劃線
- 不可以使用標點符號
- 不可以使用bash 關(guān)鍵字
2.2 使用變量
- 使用變量是 在變量名前面加上
$符號: - 可以使用
{}符號包裹變量名
name='fangfc'
echo $name
echo ${name}
- 編輯shell
[fangfc@node10009 shell]$ vim test1.sh
#!/bin/sh
name='fangfc'
echo $name
[fangfc@node10009 shell]$ chmod a+x test1.sh
[fangfc@node10009 shell]$ ./test1.sh
fangfc
[fangfc@node10009 shell]$
2.3 變量類型
shell 存在三種變量:
- 局部變量:
- 局部變量存在于腳本或命令中定義, 僅在當前shell 實例中有效, 其他shell 啟動的程序不能訪問局部變量.
- 環(huán)境變量
- 所有的程序, 包含shell啟動的程序, 都能訪問環(huán)境變量, 有些程序需要環(huán)境變量來保證正常運行, 必要的時候 shell 也可以定義環(huán)境變量
- shell 變量
- shell 變量是由shell程序設(shè)置的特殊變量, shell 變量中有一部分是環(huán)境變量, 有一部分是局部變量, 這些變量保證了shell 正常運行.
2.4 字符串定義
- 字符串時shell 編程最常用的數(shù)據(jù)類型, 字符串可以使用單引號和雙引號.
- 單引號:
str='this is stirng'- 單引號的限制
- 單引號里的任何字符串都會原樣輸出, 單引號字符串中的變量時無效的.
- 單引號字符串中 不可使用單引號,
- 雙引號:
-
str="this is string"- 雙引號里面可以使用變量
- 雙引號可以使用轉(zhuǎn)義字符
-
2.5 數(shù)組
- bash 支持一維數(shù)組(不支持多維屬組), 并且沒有數(shù)組大小限制.
- 和C 語言類似, 屬組元素下標都是從0 開始, 獲取屬組中的元素要利用下標, 下標可以是整數(shù)或算術(shù)表達式, 值應(yīng)當大于0
-
定義屬組
- shell中使用括號
()來表示數(shù)組, 數(shù)組元素使用空格 分割 數(shù)組=(值1 值2 ... 值n)
- shell中使用括號
使用屬組
- 讀取格式
${數(shù)組[下標]}
- shell 注釋
- 單行注釋:
- 以
#開頭的行就是注釋, 會被解釋器忽略. # 注釋行
- 以
- 多行注釋
:<<EOF
注釋行..
注釋行..
注釋行..
EOF
- 多行注釋的定界符可以使用其他符號
:<<abc
注釋行...
注釋行...
注釋行...
abc
2.5 示例
vim test1.sh
#!/bin/sh
# 這個腳本用于測試變量和注釋
:<<EOF
這里是多行注釋
多行注釋
EOF
name='fangfc'
# 字符串切割
echo ${name:2:3}
# 數(shù)組
arr=(11 22 33 44 'fangfc')
echo ${arr[3]}
echo ${arr[4]}
- 執(zhí)行
[fangfc@node10009 shell]$ ./test1.sh
ngf
44
fangfc
[fangfc@node10009 shell]$
3. shell 基本運算符
- shell 支持多種運算符, 包含:
- 算數(shù)運算符
- 關(guān)系運算符
- 布爾運算符
- 字符串運算符
- 文件測試運算符
3.1 算數(shù)運算符
+ 加法
- 減法
* 乘法
/ 除法
% 取余
= 賦值
== 比較運算
!= 不等于
3.2 關(guān)系運算符
關(guān)系運算符支持數(shù)字, 不支持字符串, 關(guān)系運算符需要使用 [ ] 包括.`
-eq 檢測兩個是否相等
-ne 檢測兩個是否 不相等
-gt 檢測是否 大于
-lt 檢測是否 小于
-ge 檢測是否 大于等于
-le 檢測是否 小于等于
3.3 布爾運算符
! 非運算
-o 或運算符, 有一個為 true, 則返回true
-a 與運算符, 兩個都為true, 則返回 true
3.4 邏輯運算符
&& 邏輯 AND
|| 邏輯 ||
3.5 字符串運算符
= 檢測兩個字符串是否相等
!= 檢測兩個字符串是否不相等
-z 檢測字符串 是否為空, 為空返回true
-n 檢測字符串是否為不為空, 不為空返回 true
3.6 文件測試運算符
-b file 文件是否為塊設(shè)備
-c file 文件是否為字符設(shè)備
-d file 文件是否為目錄
-g file 文件是否設(shè)置了SGID
-k file 文件是否設(shè)置了粘連位(Sticky Bit)
-p file 文件是否有管道
-u file 文件是否設(shè)置了 SUID
-r file 文件是否可讀
-w file 文件是否可寫
-x file 文件是否可執(zhí)行
-s file 文件是否 為空
-e file 文件(目錄) 是否存在
4. 流程控制
在bash 中使用 if else 作為流程控制
4.1 if 語句
- 語法
if condition
then
command1
command2
fi
- 寫成一行
if [ condition ]; then command1; command2; fi
4.2 if else 語句
- if else 語法
if condition
then
command1
..
else
command2
...
fi
- if elseif else 語法
if condition
then
command1
elif
...
else
...
fi
- 示例
[fangfc@node10009 shell]$ cat test2.sh
#!/bin/sh
a=100
b=200
# if elif 的使用
echo 'if elif'
if [ $a -eq $b ]; then
echo 'a 等于 b'
elif [ $a -gt $b ]; then
echo 'a 大于 b'
elif [ $a -lt $b ]; then
echo 'a 小于 b'
fi
[fangfc@node10009 shell]$ ./test2.sh
if elif
a 小于 b
[fangfc@node10009 shell]$
4.3 for 循環(huán)
- for 循環(huán)一般格式
for var in item1 item2 ... itemN
do
command1
...
done
變量列表中, for 循環(huán)執(zhí)行一次所有命令, 使用變量名獲取列表中的值, 命令可以使用
示例:
[fangfc@node10009 shell]$ cat test3.sh
#!/bin/sh
for val in 100 101 102 103 104
do
echo $val
done
[fangfc@node10009 shell]$ ./test3 .sh
100
101
102
103
104
[fangfc@node10009 shell]$
4.4 while 語句
- while 循環(huán)不斷執(zhí)行一系列命令, 也用于從輸入文件中讀取數(shù)據(jù), 命令通常為測試條件
- 格式:
while condition
do
command
done
- 示例
[fangfc@node10009 shell]$ cat test4.sh
#!/bin/sh
i=0
num=1
while (( $num<=5 ))
do
echo $num
num=`expr $num + 1`
done
[fangfc@node10009 shell]$ ./test4.sh
1
2
3
4
5
[fangfc@node10009 shell]$
4.5 until 循環(huán)
until 循環(huán)執(zhí)行一系列命令, 知道條件為 True 停止,
- until 循環(huán)和 while 循環(huán)在處理方式上相反,
- 一般while 循環(huán)優(yōu)于
4.6 case
- case 語句為多選擇語句, 可以使用case 語句匹配一個值與一個模式, 如果匹配成功, 執(zhí)行相匹配的命令.
- case 語句的格式
case $val in
模式1)
command1
...
;;
模式2)
command2
...
;;
模式3)
command3
...
;;
esac
caze 工作方式是 取值后面必須為
in關(guān)鍵字,取值將檢測匹配每一個模式, 一旦模式匹配, 相應(yīng)命令不在繼續(xù)其他模式, 如果都不匹配則會被
*)模式匹配到.示例
[fangfc@node10009 shell]$ cat ./test5.sh
#!/bin/sh
# 獲取參數(shù)
if [ $# -eq 0 ]; then
echo '請輸入攜帶參數(shù):a,b,c'
break
fi
case $1 in
'a')
echo "參數(shù)是$1"
;;
'b')
echo "參數(shù)是$1"
;;
'c')
echo "參數(shù)是$1"
;;
*)
echo '請輸入攜帶參數(shù):a,b,c'
;;
esac
[fangfc@node10009 shell]$ ./test5.sh a
參數(shù)是a
[fangfc@node10009 shell]$
4.6 跳出循環(huán)
- 循環(huán)過程中, 可以在未達到循環(huán)條件時 強制跳出循環(huán).
- break 命令允許跳出循環(huán)(終止執(zhí)行后面的循環(huán))
- continue 類似于 break 不過不會跳出所有循環(huán), 僅跳出當前循環(huán).
4.7 exit 退出當前shell
- exit 命令用于退出當前shell, 在shell 腳本中可以終止當前腳本執(zhí)行.
- 退出時可以指定 退出碼.
- 退出碼:
0 表示成功
非0 表示失敗
-- 常用的約定的退出碼
2 用法不當
127 命令沒有找到
126 不可執(zhí)行
>=128 信號
END