1. 程式人生 > >linux計算機基礎之engineer DAY02

linux計算機基礎之engineer DAY02

Shell指令碼     指令碼:一個可以執行的檔案,可實現某種功能
案例1:第一個Shell指令碼
[[email protected] ~]# vim /root/hello.sh
echo hello world
[[email protected] ~]# chmod  +x  /root/hello.sh       #賦予執行許可權 [[email protected] ~]# /root/hello.sh                         #絕對路徑執行   規範Shell指令碼的一般組成
#! 環境宣告(以下所有程式碼,有什麼程式執行翻譯)

• # 註釋文字
• 可執行程式碼 案例1:第一個Shell指令碼
[[email protected] ~]# cat /root/hello.sh
 #!/bin/bash
 echo hello world
 cat /etc/redhat-release
 uname -r
 hostname
 ifconfig | head -2 [[email protected] ~]# chmod  +x  /root/hello.sh [[email protected]
~]# /root/hello.sh   #絕對路徑執行  
重定向輸出       >   :只收集前面命令正確輸出結果
      2> :只收集前面命令錯誤輸出結果
      &> :收集前面命令,正確與錯誤輸出結果 ]# echo 123 > /opt/1.txt   
]# cat /opt/1.txt
]# cat /opt/a
]# cat /opt/1.txt /opt/a ]# cat /opt/1.txt /opt/a  >    /mnt/nsd.txt
]# cat /mnt/nsd.txt ]# cat /opt/1.txt /opt/a  2>    /mnt/nsd.txt
]# cat /mnt/nsd.txt ]# cat /opt/1.txt /opt/a  &>    /mnt/nsd.txt
]# cat /mnt/nsd.txt ###############################################
案例3:書寫一個可以建立使用者的指令碼          /dev/null:黑洞裝置
[[email protected] ~]# vim /root/user.sh
 #!/bin/bash
 useradd nsd04  &>  /dev/null
 echo 使用者nsd04建立成功
 echo 123  |  passwd  --stdin  nsd04  &> /dev/null
 echo 使用者nsd04密碼設定成功 [[email protected] ~]# /root/user.sh  為了增加指令碼靈活性,以及適應多變的需求所以使用變數   變數:會變化的量     類似於容器,以不變的名稱,儲存可以變化的值
            – 方便以固定名稱重複使用某個值
  變數名=值 [[email protected] ~]# vim /root/user.sh
  #!/bin/bash
  a=zhangsan                 #定義變數a儲存值zhangsan
  useradd $a &> /dev/null    #$a使用變數a儲存的值
  echo 使用者$a建立成功
  echo 123 | passwd --stdin $a &> /dev/null
  echo 使用者$a密碼設定成功 [[email protected] ~]# /root/user.sh
定義/賦值變數
• 設定變數時的注意事項
– 等號兩邊不要有空格
– 變數名只能由字母/數字/下劃線組成,區分大小寫
– 變數名不能以數字開頭,不要使用關鍵字和特殊字元
– 若指定的變數名已存在,相當於為此變數重新賦值
• 基本格式
引用變數值:$變數名
– 檢視變數值:echo $變數名、echo ${變數名} [[email protected] ~]# a=rhel
[[email protected] ~]# echo $a
rhel
[[email protected] ~]# echo ${a}
rhel
[[email protected] ~]# echo $a7 [[email protected] ~]# echo ${a}7
rhel7
[[email protected] ~]#
############################################
   '  ':取消所有特殊意義字元,變為普通字元   $(  )  或  反撇號 `  ` : 將命令的輸出,作為引數直接參與下一條命令 [[email protected] ~]# rm -rf /opt/*
[[email protected] ~]# date +%F
[[email protected] opt]# cd  /opt
[[email protected] opt]# mkdir `date +%F`
[[email protected] opt]# ls [[email protected] opt]# mkdir MySQL-`date +%F`
[[email protected] opt]# ls [[email protected] opt]# mkdir `hostname`
[[email protected] opt]# ls
[[email protected] opt]# mkdir  nsd-$(date +%F)
[[email protected] opt]# ls ################################################
環境變數:變數名一般都大寫,由系統定義完成,並且賦值完成    USER=當前登陸系統的使用者名稱
[[email protected] /]# echo  $USER
root
[[email protected] /]# su - nsd01
[[email protected] ~]$ echo $USER
nsd01
[[email protected] ~]$ exit
logout
[[email protected] /]# su - student
[[email protected] ~]$ echo $USER
student
[[email protected] ~]$ exit
logout
[[email protected] /]#
位置變數:由系統定義完成,並且賦值完成
• 在執行指令碼時,提供的命令列引數
– 表示為 $n,n為序號
– $1、$2、.. .. ${10}、${11}、.. ..
[[email protected] /]# vim /root/user.sh
 #!/bin/bash
 useradd $1 &> /dev/null
 echo 使用者$1建立成功
 echo 123 | passwd --stdin $1 &> /dev/null
 echo 使用者$1密碼設定成功
[[email protected] /]# /root/user.sh   zhangsan
[[email protected] /]# /root/user.sh   tom
[[email protected] /]# /root/user.sh   harry
[[email protected] /]# vim  /root/1.sh
 #!/bin/bash
 cat -n $1  |  head -$2
 echo 顯示$1檔案的頭$2行 [[email protected] /]# /root/1.sh  /etc/passwd  4
################################################
  讓使用者體驗更好,降低指令碼使用難度,讓指令碼執行產生互動     read :
                 1.產生互動,會等待使用者輸入內容
                 2.記錄使用者在鍵盤上的輸入
                 3.將使用者在鍵盤上的輸入,賦值給變數儲存      -p  '螢幕輸出資訊' [[email protected] /]# vim /root/user.sh
 #!/bin/bash
 read -p  '請輸入您要建立的使用者名稱:'    a
 useradd  $a  &> /dev/null
 echo  使用者$a建立成功
 echo  123 |  passwd  --stdin  $a &> /dev/null
 echo  使用者$a密碼設定成功
[[email protected] /]# #################################################
預定義變數:由系統定義完成,並且賦值完成   $#   已載入的位置變數的個數(統計一共輸入多少個位置變數)
 $*   輸出所有位置變數的值  $?   程式退出後的狀態值,0表示正常,其他值異常 [[email protected] /]# cat /root/2.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $#      統計一共輸入了多少個位置變數的值
echo $*      輸出所有位置變數的值 [[email protected] /]# /root/2.sh [[email protected] /]# /root/2.sh  dc tc dz tz   [[email protected] /]# useradd natasha
[[email protected] /]# echo $?         #為0代表上條命令成功
[[email protected] /]# useradd natasha
[[email protected] /]# echo $?         #非0值代表上條命令失敗 [[email protected] /]# id natasha
uid=1016(natasha) gid=1016(natasha) 組=1016(natasha)
[[email protected] /]# echo $?      #為0代表上條命令成功
0
[[email protected] /]# id hahaxixi
id: hahaxixi: no such user
[[email protected] /]# echo $?      #非0值代表上條命令失敗
1   #################################################
條件測試及選擇     [  測試表達式  ]    每一部分之間都要有空格  -r:文件存在,且對文件具備讀取許可權為真
 -w:文件存在,且對文件具備寫許可權為真
 -x:文件存在,且對文件具備執行許可權為真
• 檢查檔案狀態                        
  -e:文件存在為真
 -d:文件存在,且為目錄為真
 -f:文件存在,且為檔案為真 [[email protected] /]# [ -f /etc/passwd ]
[[email protected] /]# echo $?
[[email protected] /]# [ -f /etc/ ]
[[email protected] /]# echo $? [[email protected] /]# [ -d /etc/passwd ]
[[email protected] /]# echo $?
[[email protected] /]# [ -d /etc/]
[[email protected] /]# echo $? • 比較整數大小
  -gt:大於 #greater than
  -ge:大於等於 greater equal   -eq:等於     equal
  -ne:不等於 no equal
  -le:小於等於 little equal
  -lt:小於         little
[[email protected] /]# [ 1 -eq 1 ]
[[email protected] /]# echo $? [[email protected] /]# [ 1 -ge 1 ]
[[email protected] /]# echo $? [[email protected] /]# [ 1 -gt 1 ]
[[email protected] /]# echo $?
• 字串比對
      == :相等一致為真
     != :不相等為真
[[email protected] /]# [ student == root ]
[[email protected] /]# echo $?
1
[[email protected] /]# [ student != root ]
[[email protected] /]# echo $?
0
[[email protected] /]# [ $USER == root ]
[[email protected] /]# echo $?
0
[[email protected] /]#
############################################# if雙分支處理    if  [條件測試];then
           命令序列xx
   else
           命令序列yy
   fi [[email protected] /]# vim /root/if01.sh
 #!/bin/bash
 if  [  $1  -eq  2  ];then
   echo hello
 else
   echo hi
 fi
[[email protected] /]# /root/if01.sh  1
[[email protected] /]# /root/if01.sh  2 [[email protected] /]# cat /root/if02.sh
 #!/bin/bash
 if  [ $# -eq 0 ];then
   echo 您沒有輸入任何的命令列引數
 else
   echo 您輸入了命令列引數
   echo 您一共輸入了$#個引數
   echo 它們的值為$*
 fi [[email protected] /]# /root/if02.sh [[email protected] /]# /root/if02.sh dc tc dz tz
if多分支處理  if [條件測試1];then
    命令序列xx
 elif [條件測試2];then
    命令序列yy
 elif [條件測試3];then
    命令序列aa
         ..........
 else
    命令序列zz
 fi
案例:書寫一個成績指令碼
 
    使用者輸入考試成績,利用 read -p 手法進行獲得使用者成績
    如果成績 大於等於 90 ,則輸出 優秀
    如果成績 大於等於 80 ,則輸出 良好
    如果成績 大於等於 70 ,則輸出 一般
    如果成績 大於等於 60 ,則輸出 合格
    如果以上條件均不滿足,則輸出 再牛的肖邦也彈不出哥的悲傷! [[email protected] /]# vim /root/if04.sh
 #!/bin/bash
 read  -p   '請輸入您的成績:'    num
 if [  $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
[[email protected] /]# /root/if04.sh #########################################
for迴圈結構  for 變數名   in 值列表
 do
      命令序列
 done
[[email protected] /]# vim /root/for01.sh
 #!/bin/bash
 for  a  in  zhangsan lisi wangwu dc tc dz tz
 do
  useradd  $a   &> /dev/null
  echo  $a建立成功
 done
[[email protected] /]# /root/for01.sh
   建立使用者  nsd1~nsd50
   造數工具: {起始點..結束點}     {1..50} [[email protected] /]# rm -rf /opt/*
[[email protected] /]# touch /opt/nsd{1..10}.txt
[[email protected] /]# ls /opt/ [[email protected] /]# cat /root/for01.sh
 #!/bin/bash
 for a in {1..50}
 do
   useradd nsd$a   &> /dev/null
   echo nsd$a建立成功
 done
[[email protected] /]#
################################################# 案例:書寫一個判斷IP通訊的指令碼   使用者輸入IP地址,利用read -p 方式獲得使用者輸入的IP地址
 
  判斷如果本機可以與該IP地址通訊,則輸出 可以通訊
  判斷如果本機不可以與該IP地址通訊,則輸出 無法可以通訊 [[email protected] /]# vim /root/ip.sh
 #!/bin/bash
  read  -p  '請輸入您要測試的IP地址:'    ip
 ping  -c  2   $ip  &>  /dev/null
 if  [  $?  -eq  0  ];then
  echo  $ip可以通訊
 else
  echo  $ip無法通訊
 fi
[[email protected] /]#
###########################################