1. 程式人生 > >Shell腳本基礎

Shell腳本基礎

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腳本基礎