Shell腳本
• 腳本: 可以執行檔案,實作某種功能
• 提前設計可執行語句,用來完成特定任務的檔案(指令的堆積)
規範Shell腳本的一般組成
• #! 環境聲明(Sha-Bang) 以下所有代碼,用那個程式解釋
• # 注釋文本
• 可執行代碼
[root@server0 ~]# cat /root/hello.sh
#!/bin/bash
echo hello world
hostname
uname -r
ifconfig | head -2 | tail -1
cat /etc/redhat-release
[root@server0 ~]# /root/hello.sh
####################################################
重定向輸出
: 隻收集正确資訊的重定向 2>: 隻收集錯誤資訊的重定向 &>: 收集正确與錯誤資訊的重定向
[root@server0 ~]# echo 123 > /opt/1.txt
[root@server0 ~]# cat /opt/1.txt
[root@server0 ~]# cat /etc
[root@server0 ~]# cat /opt/1.txt /etc/
[root@server0 ~]# cat /opt/1.txt /etc/ > /mnt/a.txt
[root@server0 ~]# cat /mnt/a.txt
[root@server0 ~]# cat /opt/1.txt /etc/ 2> /mnt/a.txt
[root@server0 ~]# cat /opt/1.txt /etc/ &> /mnt/a.txt
運算:
[root@server0 ~]# echo 1+2 | bc
[root@server0 ~]# echo 2*3 | bc
[root@server0 ~]# echo 4/2 | bc
[root@server0 ~]# echo 10%3 | bc #取餘數運算
$( ):将指令的輸出結果,作為參數
[root@server0 ~]# rm -rf /opt/*
[root@server0 ~]# cd /opt/
[root@server0 opt]# date
[root@server0 opt]# date +%F #輸出年月日
[root@server0 opt]# mkdir $(date +%F)
[root@server0 opt]# ls
[root@server0 opt]# mkdir mydir-$(date +%F)
[root@server0 opt]# mkdir $(hostname)-$(date +%F)
''(單引号):取消特殊字元的意義
[root@server0 /]# echo '* >'
[root@server0 /]# echo '* > ? {} [] ~'
#####################################################
/dev/null:黑洞裝置
read 産生互動:為了降低腳本的使用難度
[root@server0 /]# cat /root/user.sh
read -p '請輸入您要建立的使用者名:' user
useradd $user &> /dev/null
echo $user使用者建立成功
echo 123 | passwd --stdin $user &> /dev/null
echo $user使用者密碼設定成功
[root@server0 /]# /root/user.sh
read -p '請輸入您要設定的密碼:' pass
echo $pass | passwd --stdin $user &> /dev/null
#################################################
變量的定義
• 以不變的名稱存放的可能會變化的值
– 變量名=變量值
– 友善以固定名稱重複使用某個值
– 提高對任務需求、運作環境變化的适應能力
• 設定變量時的注意事項
– 若指定的變量名已存在,相當于為此變量重新指派
– 等号兩邊不要有空格
– 變量名由字母/數字/下劃線組成,區分大小寫
– 變量名不能以數字開頭,不要使用關鍵字和特殊字元
• 基本格式
– 引用變量值:$變量名
– 檢視變量值:echo $變量名、echo ${變量名}
[root@server0 /]# a=rhel
[root@server0 /]# echo $a
[root@server0 /]# echo ${a}
[root@server0 /]# echo $a7
[root@server0 /]# echo ${a}7
環境變量
• 常見的環境變量
– USER(目前登陸的使用者)
– RANDOM(儲存一個随機數)
位置變量
• 在執行腳本時提供的指令行參數
– 表示為 $n,n為序号
– $1、$2、.. .. ${10}、${11}、.. ..
[root@server0 /]# vim /root/2.sh
echo $1
echo $2
echo $3
[root@server0 /]# /root/2.sh hello tom harry
[root@server0 /]# vim /root/3.sh
cat -n $1 | head -$2
[root@server0 /]# /root/3.sh /etc/passwd 3
預定義變量
$# 已加載的位置變量的個數
$* 所有位置變量的值
$? 程式退出後的狀态值,0表示正常,其他值異常
[root@server0 ~]# cat /root/3.sh
echo $#
echo $*
[root@server0 ~]# /root/3.sh haha xixi hehe lele
######################################################
常用的測試選項
• 檢查檔案狀态
-e:存在為真
-d:存在且為目錄才為真
-f:存在且為檔案才為真
-r:存在且具備讀取權限才為真
-w:存在且具備寫入權限才為真
-x:存在且具備執行權限才為真
• 比較整數大小(帶e字母的都有“等于”二字)
-gt:大于
-ge:大于等于
-eq:等于
-ne:不等于
-lt:小于
-le:小于等于
• 字元串比對
==:相等為真
!=:不相等為真
if雙分支處理
if [條件];then
指令序列xx
else
指令序列yy
fi
請書寫腳本:
使用者輸入一個使用者名,判斷使用者是否存在
如果存在 輸出使用者/etc/passwd相應一行
如果不存在 則建立該使用者
[root@server0 ~]# vim /root/6.sh
[root@server0 ~]# /root/6.sh
[root@server0 ~]# vim /root/7.sh
read -p '請輸入一個10以内的随機數字:' num1
num2=$(echo $RANDOM % 10 | bc)
if [ $num1 -eq $num2 ];then
echo 恭喜您,中獎了
echo 恭喜您,謝謝回顧
echo 正确數字為$num2
[root@server0 ~]# /root/7.sh
if多分支處理
if [條件1] ; then
elif [條件2] ; then
elif [條件3] ; then
指令序列aa
指令序列zz
[root@server0 ~]# vim /root/8.sh
read -p '請使用者輸入積分:' num
if [ $num -ge 90 ];then
echo VIP PLUS
elif [ $num -ge 80 ];then
echo VIP
elif [ $num -ge 70 ];then
echo 老司機
elif [ $num -ge 60 ];then
echo 新手
echo 仍需努力
##################################################
案例4:編寫一個判斷腳本
在 server0 上建立 /root/foo.sh 腳本
1)當運作/root/foo.sh redhat,輸出為fedora
2)當運作/root/foo.sh fedora,輸出為redhat
3)當沒有任何參數或者參數不是 redhat 或者
fedora時,其錯誤輸出産生以下資訊:
/root/foo.sh redhat|fedora
[root@server0 ~]# vim /root/foo.sh
if [ $# -eq 0 ];then
echo '/root/foo.sh redhat|fedora' >&2
exit 2
elif [ $1 == redhat ];then
echo fedora
elif [ $1 == fedora ];then
echo redhat
exit 3
[root@server0 ~]# /root/foo.sh
[root@server0 ~]# echo $?
[root@server0 ~]# /root/foo.sh 2> /opt/2.txt
[root@server0 ~]# cat /opt/2.txt
for循環結構
循環作用:讓計算機,反複執行重複性的操作
[root@server0 ~]# vim /root/10.sh
for user in kenji natasha tom harry jack
do
useradd $user
echo $user 成功
done
[root@server0 ~]# /root/10.sh
#######################################################
本文轉自sweak_h 51CTO部落格,原文連結:http://blog.51cto.com/13478354/2046913,如需轉載請自行聯系原作者