Shell腳本基礎
Shell腳本
規範Shell腳本的一般組成
#! 環境聲明(Sha-Bang)
# 註釋文本
可執行代碼
設置變量註意事項
若指定的變量名已存在,相當於為此變量重新賦值
等號兩邊不要有空格
變量名由字母/數字/下劃線組成,區分大小寫
變量名不能以數字開頭,不能用關鍵字和特殊字符
基本格式
引用變量值:$變量名
查看變量值:echo $變量名、echo ${變量名}
環境變量
一般為大寫,用來設置用戶/系統環境
PWD PATH USER LOGNAME
SHELL HOME
自定義變量
用戶自主設置 使用
例子
#!/bin/bash
echo $0
echo $1
echo $2
echo $3
echo ${10}
echo $#
echo $*
echo $@
執行
# sh ./1.sh a b c d e f
./1.sh # $0為腳本名稱
a # $1為腳本第一個參數
b # $2為腳本第二個參數
c # $3為腳本第三個參數
# $10此處指出為無值狀態 如果是"${10}"會將無值賦予變為空值
6 # $#給腳本參數的的個數
a b c d e f # $*列出艘所有參數
a b c d e f # $@列出艘所有參數
#!/bin/bash
cat -n $1 | head -$2 # 查看某文件的前2行
位置變量
在執行腳本時提供的命令行參數(非交互式傳值)
$0 $1 $2 $3 ${10}
#無值 不等於 空值
#空值對於變量是屬於有值的狀態 無值對於變量是屬於無值狀態
預定義變量
用來保存腳本程序的執行信息
直接使用這些變量
不能直接為這些變量賦值
$# $* $@
$? :執行程序退出後的狀態值,0表示正常,其他值異常
###########################################################################################
運算
# expr 10 / 3 #除法
# 3
# expr 10 \* 3 #乘法 *默認為統配符\還原一下
# 30
# expr 1 + 2 #加法
# 3
# expr 3 - 1
# 2
# expr 10 % 3 #取余
# 1
\ #反斜杠將後一個變量變為純字符
`` #相當於 $() #將命令執行後的結果輸出
# mkdir $(date +%F)date
or
# mkdir `date +%F`date
‘‘ #單引號內安純字符輸出
"" #雙引號保留其中變量輸出
useradd $user &> /dev/null # $> /dev/null 將輸出丟棄(不顯示)
&& #邏輯 與
|| #邏輯 或
! #邏輯 否
常用的測試選項
檢查文件狀態
-e:文檔存在為真
-d:文檔存在且為目錄為真
-f:文檔存在且為文件為真
-r:文檔存在且有讀取權限為真
-w:文檔存在且有寫入權限為真
-x:文檔存在且有執行權限為真
比較整數大小(e=equal g=greater l=less n=not t=than)
-gt:大於
-ge:大於等於
-eq:等於
-ne:不等於
-lt:小於
-le:小於等於
字符串比對
== #相等
!= #不相等
重定向輸出
覆蓋:
>:正確輸出
2>:錯誤輸出
&>:錯誤與正確輸出
追加:
>>:正確輸出
2>>:錯誤輸出
&>>:錯誤與正確輸出
###########################################################################################
if [條件測試1] ; then
命令序列xx
elif [條件測試2] ; then
命令序列yy
else
命令序列zz
fi
例
在 server0 上創建 /root/foo.sh 腳本
1)當運行/root/foo.sh redhat,輸出為fedora
2)當運行/root/foo.sh fedora,輸出為redhat
3)當沒有任何參數或者參數不是 redhat 或者
fedora時,其 錯誤 輸出產生以下信息:
/root/foo.sh redhat|fedora
初步寫法:
#!/bin/bash
if [ $# -eq 0 ];then
echo ‘/root/foo.sh redhat|fedora‘
exit
elif [ $1 == redhat ];then
echo fedora
exit
elif [ $1 == fedora ];then
echo redhat
exit
else
echo ‘/root/foo.sh redhat|fedora‘
fi
改進後:
#!/bin/bash
if [ "$1" == redhat ];then # $1在沒有賦值時代表 無值 狀態無法進行對比 會報錯
echo fedora # "$1"會在沒有賦值時 給其賦予空值 屬於有值狀態可以進行對比
exit # 由$1變為"$1"可減少一條空值判斷
elif [ "$1" == fedora ];then
echo redhat
exit
else
echo ‘/root/foo.sh redhat|fedora‘ >&2 # >&2 將echo的輸出定義為錯誤輸出
exit 1 #退出並將返回值改為1----echo $? 為1
fi
###########################################################################################
for循環結構
循環結構:將反復執行的語句,循環去執行
for 變量名 in 值列表
do
命令序列
done
例
編寫一個批量添加用戶腳本
在 server0 上創建 /root/batchusers 腳本
1 此腳本要求提供用戶名列表文件作為參數
2 如果沒有提供參數,此腳本應該給出提示
Usage:/root/batchusers,退出並返回相應值
3 如果提供一個不存在的文件,此腳本應該給出提示
Input file not found,退出並返回相應值
4 新用戶的登錄Shell為 /bin/false,無需設置密碼
#!/bin/bash
if [ $# -eq 0 ];then
echo ‘Usage: /root/batchusers‘ >&2
exit 1
fi
if [ -f $1 ];then
for A in $(cat $1)
do
useradd -s /bin/false $a
echo $A創建成功
done
else
echo ‘Input file not found‘ >&2
exit 1.
fi
Shell腳本基礎