你們好!我是handsomecui,下面我爲你們講解一下shell腳本的寫法,講的很差的地方,歡迎你們留言拍磚。linux
1.在linux下會寫shell腳本是很是重要的,下面我參照例子給你們展現幾個腳本,順帶這學習shell 的語法:shell
何時helloworld是必不可少的,第一個腳本確定與helloworld是離不開的:bash
#!/bin/sh a="hello world!" num=2 echo "a is : $a num is : ${num}nd"
運行結果: a is : hello world! num is : 2nd
shell腳本簡單易懂,只要有一點點c語言的基礎,這些都是小case;ide
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
#是註釋的意思,相關部分已經在裏面詳細給你們註釋解釋了,注意if語句的格式ui
if[];thenthis
elif[];thenspa
else3d
fi
另外注意if語句還能夠簡單的用&&與||或語句來代替;另外若是想要深刻了解if能夠找男人test(在linux遇到問題要學會找男人解決,man)
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的用法,能夠找linux的男人解決;
5.練習一下for語句吧
問題:寫個腳本;
1.切換工做目錄至/tmp
2.依次向/tmp目錄中的每一個文件或子目錄問好(Hello,log)
3.統計/tmp目錄下共有多個文件,並顯示出來
#!/bin/bash cd /tmp for i in /tmp/* do echo "Hello , $i" done count=`ls -l|grep '^-'|wc -l` echo "====file_count:$count===="
這個問題就相對簡單了些,一個for語句就能夠搞定,固然能夠while搞搞
6.那麼問題來了:
question:
傳遞兩個整數給腳本,讓腳本分別計算並顯示這兩個整數的和,差,積,商
#!/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))"
這裏要注意的是,須要傳入兩個參數;
具體用到的一些知識請看下面:
讀到這裏你們對上面的小腳本是否是感受特別easy了,哈哈;
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
在這裏2>&1表明不顯示錯誤信息,其實就是把錯誤重定向到標準輸出,而後重定向到/dev/null,/dev/null就是個黑洞,寫入的任何東西都會丟失,其實簡要說就是把正確或錯誤的輸出扔到垃圾桶。
寫到這裏你們是否是感受耳目一新吶,哈哈!
隨筆練習:還有點bug
#/bin/bash i=1 sum=0 #while while [ $i -le 100 ] do ((sum=sum+i)) ((i=i+1)) done echo $sum #for sum=0 for ((j=1;j<=100;j++)) do ((sum=sum+j)) done echo $sum #select select flag in $@ do case $flag in $1)echo $1;; $2)echo $2;; $3)echo $3;; $4)echo $4;; *)echo "input error" break ;; esac done #shift echo -e "the all arg is\n" while [ $1 ] do echo $1 shift done #if num=`ls | wc -l` [ num == 0 ] && echo -e "have no file\n" || echo -e "there are $num files\n" for file in `ls` do echo "this file $file is " [ -f $file ] && echo -e "ordinary file" if [ -d $file ];then echo -e "dictionary file"; fi done #function filename="" rename(){ filename=echo `date` | awk -F ' ' '{print $1 $2 $3}' } rename echo -e "filename is $filename" [ $? == 0 ] && mkdir $filename || echo -e "have error\n"