天天看點

engineer1

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,如需轉載請自行聯系原作者

繼續閱讀