1. 程式人生 > >運維—shell指令碼

運維—shell指令碼

下面我為大家介紹一下shell指令碼的寫法。

1.在linux下會寫shell指令碼是非常重要的,下面我參照例子給大家展示幾個指令碼,順帶這學習shell 的語法:

任何語言都是Hello World,第一個指令碼肯定與Hello World是離不開的:

#!/bin/sh
a="Hello World!"
num=5
echo "a is : $a num is : ${num}nd"
執行結果: a is : Hello World! num is : 5nd

 

2.下面帶著大家學學if語句:

先丟擲一個問題:寫一個指令碼,判斷當前所用的shell

 
#!/bin/sh
#注意if的空格以及[]裡面的空格這裡錯了半天啊
if [ "$SHELL" = "/bin/bash" ];then
echo "your login shell is the bash \n"
echo "SHELL is : $SHELL"
else 
echo "your login shell is not bash but $SHELL"
fi
#[ -f "somefile" ] : 判斷是否是一個檔案
#[ -x "/bin/ls" ] : 判斷/bin/ls是否存在並有可執行許可權
#{ -n "$var" } : 判斷$var變數是否有值
#[ "&a" = "$b" ] : 判斷$a和$b是否相等
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwords"
if [ -f "/etc/shadow" ];then
echo "電腦密碼使用隱藏字元"
else
echo "並沒有"
fi

#是註釋的意思

 

3.為了讓大家更加熟練的運用shell,那麼練習下吧,問題:寫一個指令碼使其從一個檔案裡面讀入有echo的語句,並把其寫在本檔案末尾;

 
#!/bin/sh
#-r代表此檔案是否可讀,具體見man test
mailfolder=/home/handsome/work/linux_learn/shell_learn/readme.txt
#[ -r "$mailfolder" ] || { echo "Can not read $mailfolder" ; exit 1;}
#echo "$mailfolder has mail from : "
#grep "^echo " $mailfolder

if [ -r "$mailfolder" ];then
    echo "$mailfolder has massage from : "
    echo | grep '^echo ' $mailfolder >> readme2.txt
    chmod +r readme2.txt
    cat readme2.txt >> $mailfolder
    rm -f readme2.txt
else
    echo "Can not read $mailfolder"
    touch $mailfolder
    chmod +rw $mailfolder
    echo "echo 天將降大任於斯人也! " >> $mailfolder
fi
 

這裡由於重定向不能本文見輸出到本檔案輸出,可以新建個檔案,再重定向到這個檔案

 

4.接下來,我們練習下while的用法

問題:寫一個指令碼(不建議使用for變數--for是根據空格取值)

1.設定變數FILE的值為/etc/passwd

2.依次向/etc/passwd中的每個使用者問好,並且說出對方的ID什麼Hello,root,your UID is0.

3.統計一個有多少個使用者

 
#!/bin/bash
fl=/etc/passwd
count=`cat $fl | wc -l`
#下面是一個管道,下面迴圈讀檔案中的每一行
cat $fl |
while read line
do
    user=`echo $line|awk -F ':' '{print $1}'`
    #代表以 :分段$1就是取第1段
    uid=`echo $line|awk -F ':' '{print $3}'`
    echo "hello, $user Your UID is $uid"
done
echo "====User_count:$count===="
#前面求得的使用者數

這裡要注意到awk的用法

 

5.介紹下for語句

問題:寫個指令碼;

1.切換工作目錄至/tmp

2.依次向/tmp目錄中的每個檔案或子目錄問好Hello,log

3.統計/tmp目錄下共有多個檔案,並顯示出來

1 2 3 4 5 6 7 8 #!/bin/bash cd /tmp for in /tmp/* do     echo "Hello , $i" done count=`ls -l|grep '^-'|wc -l` echo "====file_count:$count===="

 

 

6.那麼問題來了:

如何傳遞兩個整數給指令碼,讓指令碼分別計算並顯示這兩個整數的和,差,積,商

 
#!/bin/bash
a=$1
b=$2
[ -z $a ] && echo "please \$1 number1" && exit 1
[ -z $b ] && echo "please \$2 number2" && exit 2
[ ! $# -eq 2 ] && echo "--please num1 num2" && exit 3
# $#傳遞到指令碼的引數個數
# -eq相當於=, -ne相當於不等於, -ge >= , -gt >, -le <=, -lt <
echo "$a + $b = $(($a+$b))"
echo "$a - $b = $(($a - $b))"
echo "$a * $b = $(($a*$b))"
echo "$a / $b = $(($a/$b))"
 

這裡要注意的是,需要傳入兩個引數;

具體用到的一些知識請看下面:

 

7.寫一個指令碼;求1到100的和?

#!/bin/bash
sum=0
i=1
while [ $i -le 100 ]
do
    sum=$(($sum + $i))
    i=$(($i+1))
done
echo "$sum"
 

這個指令碼就so easy了;

8.檢視IP地址 

我們可以 通過ping命令測試192.168.0.151到192.168.0.254之間的所有主機是否線上

 
#!/bin/bash
for i in `seq 2 254`
do
    ping -c1 -w1 192.168.51.$i > /dev/null 2>&1
    #-c可以指定ping的次數,-w測試的時間 -w 1就是1秒中無論成功失敗都結束
    #-c -w後面都要輸入引數所以都要帶上l
    #$?代表最後命令退出狀態,0代表沒錯,其他代表有錯
    [ $? -eq 0 ] && echo "192.168.51.$i IP is UP!" || echo "192.168.51.$i IP is down!"
done