linux學習筆記--工程師技術:shell腳本基礎

 Shell腳本


    腳本:可以執行文件,運行後可以實現某種功能(命令的堆積,非交互)


規範Shell腳本的一般組成

#! 環境聲明(Sha-Bang)

# 註釋文本

可執行代碼


#!/bin/bash   #環境聲明,聲明寫的腳本是bash這個程序翻譯的




一、書寫第一腳本程序

[root@server0 ~]# vim /root/1.sh 


 #!/bin/bash

 echo hello world

 hostname

 cat  /etc/redhat-release

 ifconfig | head -2  | tail -1


[root@server0 ~]# /root/1.sh


二、書寫爲Server0自動搭建Yum的腳本

[root@server0 ~]# vim /root/yum.sh         #要注意排版,echo裏的內容要頂行寫,echo 後的'要在同一行

 #!/bin/bash

 rm -rf /etc/yum.repos.d/*

 echo '[dvd]

 name=dvd

 baseurl=http://172.25.254.254/content/rhel7.0/x86_64/dvd/

 enabled=1

 gpgcheck=0'  > /etc/yum.repos.d/haha.repo

 yum clean all

 yum repolist


[root@server0 ~]# /root/1.sh       #顯示權限不夠,因爲vim下寫的都是普通的文本,需要賦予x執行權限

-bash: /root/1.sh: 權限不夠

[root@server0 ~]# chmod +x /root/yum.sh     

[root@server0 ~]# /root/yum.sh

管道傳遞

使用 | 管道操作

– 將前一條命令的標準輸出交給後一條命令處理



三、重定向輸出


    >:只收集前面命令的正確輸出,錯誤的顯示在命令行

    2>:只收集前面命令的錯誤輸出,正確的顯示在命令行

    &>:收集前面命令的錯誤與正確輸出,不顯示在命令行


[root@server0 ~]# echo 123 > /opt/1.txt

[root@server0 ~]# cat /opt/1.txt

123

[root@server0 ~]# cat /opt/1.txt /etc/

cat: /etc/: 是一個目錄

[root@server0 ~]# cat /opt/1.txt /etc/ > /opt/a.txt    

cat: /etc/: 是一個目錄

[root@server0 ~]# cat /opt/a.txt

123

[root@server0 ~]# cat /opt/1.txt /etc/ 2> /opt/a.txt

123

[root@server0 ~]# cat /opt/a.txt

123

[root@server0 ~]# cat /opt/1.txt /etc/ &> /opt/a.txt    #不顯示

[root@server0 ~]# cat /opt/a.txt

123

cat: /etc/: 是一個目錄

-------------------------------------------------------------------------------------------

三、書寫創建用戶並設置密碼的腳本

[root@server0 ~]# vim /root/user.sh

 #!/bin/bash

 useradd test06

 echo 123 | passwd --stdin test06


[root@server0 ~]#  chmod +x /root/user.sh

[root@server0 ~]# /root/user.sh

更改用戶 test06 的密碼 。

passwd:所有的身份驗證令牌已經成功更新。



要使其不顯示信息


/dev/null  #Linux黑洞設備,專用於收集不要的輸出結果

[root@server0 ~]# vim /root/user.sh

#!/bin/bash

useradd test06 &> /dev/null

echo test06創建成功

echo 123 | passwd --stdin test06 &> /dev/null

echo test06密碼設置成功


[root@server0 ~]#  chmod +x /root/user.sh

[root@server0 ~]# /root/user.sh

test06創建成功

test06密碼設置成功


  

   變量:爲了增加腳本的適用環境的能力,增加腳本的靈活度,方便。


   變量: 容器,以不變的名稱,儲存變化的值


      變量名=變化的值


  使用變量:    $變量名



   爲了降低腳本使用難度,可以產生交互

  read :可以產生交互,將鍵盤輸入的內容賦值給變量



[root@server0 ~]# vim /root/user.sh

 #!/bin/bash

 read  -p  '請輸入您要建立的用戶:'   user

 read  -p  '請輸入您要設置的密碼:'   pass

 useradd  $user  &> /dev/null

 echo $user創建成功

 echo $pass | passwd --stdin $user &> /dev/null

 echo $user密碼設置成功


[root@server0 ~]# /root/user.sh

請輸入您要創建的帳號:kobe

請輸入您要設置的密碼:248

kobe創建成功

kobe密碼設置成功


-------------------------------------------------------------------------------------------

什麼是變量

以不變的名稱存放的可能會變化的值

– 變量名=變量值

– 方便以固定名稱重複使用某個值

– 提高對任務需求、運行環境變化的適應能力



設置變量時的注意事項

– 若指定的變量名已存在,相當於爲此變量重新賦值

– 等號兩邊不要有空格

– 變量名由字母/數字/下劃線組成,區分大小寫

– 變量名不能以數字開頭,不要使用關鍵字和特殊字符



基本格式

– 引用變量值:$變量名

– 查看變量值:echo $變量名,echo ${變量名}




變量的種類


位置變量

在執行腳本時提供的命令行參數(非交互式傳值)

$加數字($1、$2、$3.....):腳本文件名後面帶有參數的默認變量

[root@server0 ~]# vim  /root/2.sh

 #!/bin/bash

 echo $1

 echo $2

 echo $3

 echo ${10}         #顯示超過兩位數的值要加{} 

 echo ${11}     

 echo $21           #不加{}則顯示前一位的值再加後一位的值


[root@server0 ~]# /root/2.sh haha  benniu  xixi  hehe   lele   dc  tc   dz   tz 100 200


haha

benniu

xixi

100                    #顯示第十個值爲100

200                    #顯示第十個值爲200

benniu1       #顯示第二個值加個1爲benniu1



[root@server0 ~]# vim /root/3.sh

  #!/bin/bash

  cat -n $1  |  head -$2             # $1表示要查看的文件內容加行號,$2表示前兩行



[root@server0 ~]# /root/3.sh /etc/passwd   2

     1 root:x:0:0:root:/root:/bin/bash

     2 bin:x:1:1:bin:/bin:/sbin/nologin




 預定義變量

   用來保存腳本程序的執行信息

– 直接使用這些變量

– 不能直接爲這些變量賦值


 $#  已加載的位置變量的個數

 $*  所有位置變量的值

 $?  程序退出後的狀態值,0表示正常,其他值異常




[root@server0 ~]# vim /root/2.sh 


 #!/bin/bash

 echo $1

 echo $2

 echo $3

 echo ${10} 

 echo ${11}

 echo $#       

 echo $*       


[root@server0 ~]# /root/2.sh  1  2 3 4 5 6 7 8 9 10 11

1

2

3

10

11

21

11                         #顯示已加載的位置變量的個數爲11

1 2 3 4 5 6 7 8 9 10 11     #顯示所有位置變量的值


----------------------------------------------------------------------------------------

 運算 

  

[root@server0 ~]# expr 10 / 3


[root@server0 ~]# expr 10 \* 3     #單獨*顯示語法錯誤,前面加\表示乘號


[root@server0 ~]# expr 1 + 2


[root@server0 ~]# expr 3 - 1


[root@server0 ~]# expr 10  %  3    #取餘數 運算


 $() :將()裏命令的輸出結果,作爲參數顯示

[root@server0 opt]# date

[root@server0 opt]# date +%F    #只顯示年月日

[root@server0 opt]# cd /opt


[root@server0 opt]# mkdir   $(date +%F)

[root@server0 opt]# ls

2017-11-07 


[root@server0 opt]# mkdir   mydir-$(date +%F)

[root@server0 opt]# ls

2017-11-07  mydir-2017-11-07


[root@server0 opt]# mkdir   MariaDB-$(date +%F)

[root@server0 opt]# ls

2017-11-07  MariaDB-2017-11-07  mydir-2017-11-07


[root@server0 opt]# mkdir   $(hostname)-$(date +%F)

[root@server0 opt]# ls

2017-11-07  mydir-2017-11-07   MariaDB-2017-11-07  server0.example.com-2017-11-07


-------------------------------------------------------------------------------------------

常用的測試選項

檢查文件狀態

-e:文檔存在爲真

-d:文檔存在且爲目錄爲真

-f:文檔存在且爲文件爲真

-r:文檔存在且有讀取權限爲真

-w:文檔存在且有寫入權限爲真

-x:文檔存在且有執行權限爲真


比較整數大小(帶e都有等於二字,g代表大於,l代表小於)


-gt:大於

-ge:大於等於

-eq:等於

-ne:不等於

-lt:小於

-le:小於等於


字符串比對

== :相等

!=:不相等



----------------------------------------------------------------------------------------

if單分支語句


if [ 條件測試 ] ; then        #[]裏一定要有空格

     命令序列xx

 else

     命令序列yy

 fi


[root@server0 /]# vim  /root/5.sh

 #!/bin/bash

 if  [ $1 -eq $2 ];then 

   echo hello

 else

   echo hi

 fi


[root@server0 /]# /root/5.sh  1 1 

hello


[root@server0 /]# /root/5.sh  1 2

hi



請書寫一個腳本:

   用戶輸入一個IP地址(read),判斷是否可以與該IP地址通信,能通則輸出 "IP ok"   否則 輸出 "IP no"


[root@server0 /]# vim  /root/6.sh


   #!/bin/bash

   read  -p  '請輸入一個IP地址:'  ip    #變量爲ip

   ping  -c  2  $ip  &> /dev/null


     if [ $? -eq 0 ];then

          echo  ${ip} ok

      else

          echo  ${ip} no 

     fi 


[root@server0 /]#   /root/6.sh

請輸入一個IP地址:127.0.0.1

127.0.0.1 ok


[root@server0 ~]# /root/6.sh

請輸入一個IP地址:1.1.1.1

1.1.1.1 no




-----------------------------------------------------------------------------------------

if多分支語句

if [條件測試1] ; then

      命令序列xx

 elif [條件測試2] ; then

      命令序列yy

 else

      命令序列zz

 fi

  

     

    成績    大於等於90    優秀

   大於等於80    良好             

   大於等於70    及格  

   大於等於60    仍需努力  

   60以下          在牛的肖邦,也彈不出哥憂傷





[root@server0 ~]# vim /root/8.sh

#!/bin/bash

 read -p  '請輸入您的成績:'     num

if [ $num -gt  100 ];then        #大於100分

     echo 成績有誤

  elif [ $num -lt 0 ];then       #小於0分

     echo 成績有誤

  elif [ $num -ge 90 ];then

     echo 優秀

  elif [ $num -ge 80 ];then

     echo 良好

  elif [ $num -ge 70 ];then

     echo 及格

  elif [ $num -ge 60 ];then

     echo 仍需努力

  else 

    echo 在牛的肖邦,也彈不出哥憂傷

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





 ' ':把所有的特殊字符,當作普通文本字符輸出


[root@server0 ~]# vim  /root/foo.sh

 #!/bin/bash

 if [  $1  ==  redhat  ];then

   echo  fedora

 elif [  $1  ==  fedora  ];then

   echo  redhat

 else

   echo  '/root/foo.sh  redhat|fedora'

 fi


[root@server0 ~]# /root/foo.sh redhat

[root@server0 ~]# /root/foo.sh fedora

[root@server0 ~]# /root/foo.sh haha



 #!/bin/bash

 if [ $# -eq 0 ];then      #表示腳本文件後位置變量的個數爲0時,即沒有任何參數(不輸入參數)

   echo '/root/foo.sh  redhat|fedora'

  elif [ $1 == redhat ];then

   echo fedora

  elif [ $1 == fedora ];then

   echo redhat

 else

   echo '/root/foo.sh  redhat|fedora'              #此輸出爲正確的,用echo$?驗證爲0

 fi



      

       " ":可以將 “沒有” 變成 “ 空值”



 #!/bin/bash

 if [ "$1" == redhat ];then

   echo fedora

  elif [ "$1" == fedora ];then

   echo redhat

 else

   echo '/root/foo.sh  redhat|fedora'  >&2   #將正確輸出變成錯誤

   exit 2                     #腳本退出返回值,即上一行命令爲錯時echo$?顯示不爲0的指定值2

 fi


-------------------------------------------------------------------------------------------

 for循環結構


  循環結構:將反覆執行的語句,循環去執行



  for 變量名 in   值列表

  do

        命令序列

  done





[root@server0 /]# vim  /root/for.sh

  #!/bin/bash

  for a in 1 2 3 4 5

  do

    useradd nsd$a

    echo nsd$a創建成功

  done


[root@server0 /]# vim  /root/for02.sh

  #!/bin/bash

  for a in 1 2 3 4 5

  do

      echo hello

  done


-------------------------------------------------------------------------------------------


案例5:編寫一個批量添加用戶腳本

           在 server0 上創建 /root/batchusers 腳本

1)此腳本要求提供用戶名列表文件作爲參數

2)如果沒有提供參數,此腳本應該給出提示 

       Usage:/root/batchusers,退出並返回相應值

3)如果提供一個不存在的文件,此腳本應該給出提

示 Input file not found,退出並返回相應值

4)新用戶的登錄Shell爲 /bin/false,無需設置密碼

5)用戶列表測試文件:

http://cla***oom/pub/materials/userlist


 

# wgethttp://cla***oom/pub/materials/userlist 


[root@server0 /]# vim  /root/batchusers

 #!/bin/bash

 if [ $# -eq 0 ];then

    echo 'Usage: /root/batchusers' >&2

    exit 1

 fi

 if [ ! -e $1 ];then              # !表示不存在

    echo 'Input file not found' >&2

    exit 2

 fi

 for  a  in $(cat $1)

 do

    useradd -s /bin/false $a

    echo $a創建成功

 done


[root@server0 ~]# cat userlist

duanwu

zhongqiu

zhsan

lisi


[root@server0 ~]# /root/batchusers userlist    #可以自己創建別的用戶

duanwu創建成功

zhongqiu創建成功

zhsan創建成功

lisi創建成功


-----------------------------------------------------------------------------------------

#!/bin/bash

 if [ $# -eq 0 ];then

    echo 'Usage: /root/batchusers' >&2

    exit 1

 fi

 if [ -e $1 ];then

    for  a  in $(cat $1)

     do

    useradd -s /bin/false $a

    echo $a創建成功

     done

  else

    echo 'Input file not found' >&2

    exit 2

 fi

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章