溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

bash基礎

發布時間:2020-08-11 23:16:43 來源:ITPUB博客 閱讀:178 作者:nh39304 欄目:建站服務器

基礎知識:

    變量:  變量名+指向的內存空間;
    變量賦值:  var_name=value;
    變量類型: 
        數據存儲的格式,表示的數據范圍;
        字符型,數字型,布爾型;
        C語音是強變量類型(使用前必須聲明類型,類型聲明后不能改變);bash是弱變量類型(無需事先聲明,
                類型隨需求改變);
        bash默認變量類型為字符型;
        要進行算術運算,需要聲明為數字型:
        declare -i  var_name
        變量引用:  ${var_name}   $var_name

算術運算:

       let VAR=expression;
       VAR= $[expression];
       VAR= $((expression));
       VAR= $(expr argu1 argu2 argu3 )
       注意:有些時候乘法符號需要用轉義字符;
       增強型賦值: += ,-= , *=, %=
       變量做某種運算后回存到此變量中
         let i=$i+n  ---> let i+=n  --->這個let的變量不用出現$
         let i+=1    ---> let i++
         let i-=i    ---> let i--
條件測試:	
    (1)執行命令,并利用命令返回狀態判斷, $?
       0: 成功  ,1~255失敗 
      腳本的狀態返回值:默認是返回最后一條命名的狀態返回值
     自定義退出狀態碼:exit [n]:  n為指定的狀態碼
    (2)測試表達式
     test expression
     [ expression ]   ----注意expression兩邊必須有空白字符
     [[ expression ]]   
數值測試:
  -eq:  是否等于   [ $sum1  -eq  $sum2 ]
  -ne:  是否不等于
  -gt:  是否打于
  -ge:  是否大于等于
  -lt:  是否小于
  -le:  是否小于等于
字符測試:
  ==:  等于
  >:   大于
  <:   小于
  !=   不等于
注意: a.字符串要加雙引號;
       b.字符串測試要是有[[  ]];
          
          =~ : 左側字符串是否能夠被右側的PATTERN所匹配;
          -z “string”: 判斷指定的字符串是否為空,空為真;
          -n “string”: 判斷指定的字符串是否為空,非空為真;
       
        文件測試
           存在性測試:
             -a FILE  存在為真
             -e FILE  存在為真
           存在性及類型測試:
             -b FILE   塊文件
             -c FILE   字符文件
             -d FILE   目錄
             -f FILE   普通文件
             -h FILE   符合鏈接文件
             -P FILE   管道文件(大寫P)
             -S FILE   套接字文件(大寫S)
            
            文件權限性測試
             -r FILE   ;  -w FILE  ;-x FILE  ;
             -U FILE (suid權限) ; -g FILE(sgid權限); -K FILE(sticky權限)
            文件是否有內容
             -s FILE
            時間戳
             -N FILE 文件自上一次讀后是否被修改過;
            從屬關系
             -O 當前用戶是否文件的屬主
             -G 當前用戶是否文件的屬組
            雙目測試
              FILE1 -ef FILE2  是否指向相同inode的硬連接
              FILE1 -nt FILE2  FILE1是否新于FILE2
              FILE1 -ot FILE2  FILE1是否舊于FILE2
組合測試條件
  邏輯運算
  (1)  
        COMMAND1 && COMMAND2
        可以這樣來使用:相當于if command1 is true then command2,
        因為先判斷command1,ture才會執行command2
     COMMAND1 || COMMAND2
          可以這樣來使用:相當于else,因為先判斷command1,command1是ture的話,就不執行command2了
     COMMAND1 !  COMMAND2
  (2) 
     EXPRESSION1 -a EXPRESSION2
     EXPRESSION1 -0 EXPRESSION2
     !EXPRESSION2
     注意: 邏輯運算符前后都有空白字符
     邏輯運算優先級別 !> -a > -o, 改變級別用括號,括號要用轉義字符,前后留空

 示例:

logic_script.sh
#!/bin/bash
#
file=/tmp/logic_script.sh
  [ 6 -lt 7 ] && echo "1" || echo "0"
  [ "is a good day" =~ "day" ] && echo "1" || echo "0"   
  [ -a $file] && echo "1" || echo "0"          
[root@localhost tmp]# bash -x logic_script.sh 
+ file=/tmp/logic_scritp.sh           ---看||的邏輯,前面為真,后面就不執行了
+ '[' 6 -lt 7 ']'
+ echo 1
1
+ '[' isagoodday '=~' day ']'
logic_script.sh: line 6: [: =~: binary operator expected  ---字符串比較要兩個中括號[[]]
+ echo 0
+ '[' -a '/tmp/logic_scritp.sh]'
logic_script.sh: line 7: [: missing `]'  ---看錯誤提示,]沒有空格隔開,變為missing `]'
+ echo 0
            
修改后: 
logic_script.sh  
#!/bin/bash
#
file=/tmp/logic_script.sh
  [ 6 -lt 7 ] && echo "1" || echo "0"
  [[ "isagoodday" =~ "day" ]] && echo "1" || echo "0"
  [ -a $file ] && echo "1" || echo "0"
[root@localhost tmp]# bash -x logic_script.sh 
+ file=/tmp/logic_script.sh
+ '[' 6 -lt 7 ']'
+ echo 1
1
+ [[ isagoodday =~ day ]]
+ echo 1
1
+ '[' -a /tmp/logic_script.sh ']'
+ echo 1
1

變量作用域            

 環境變量: 當前shell進行及子進程有效
                賦值: (1)export var_name=value
                       (2)var_name= value
                            export var_name
                       (3)declare -x var_name=value
                       (4)var_name=value
                            delare -x var_name
                       注意: bash內嵌了許多環境變量(通常全為大寫字母)
                查看: export , declare -x  , env
                
            本地變量: 當前運行腳本的shell進行的生命周期,對子shell無效
                賦值: var_name=value
                引用: ${var_name}  , $var_name
                查看: set
                撤銷: unset var_name(此處不能用$)
                   
            
            局部變量: 某代碼的片段,如函數的上下文,作用在函數的生命周期,函數結束就銷毀;
                賦值: local var_name=vaule               
                             
            位置參數變量:當前執行腳本的shell進程傳遞的參數
                使用方式:myscript argue1  argu2 argu3 ... --->執行腳本時直接賦值給參數
                引用方式:$1 , $2  ,$3,...   
                
                輪替: shift n  把后面第n個參數輪替到第一個參數,n前面的參數都踢掉
                
            
                特殊變量:
                    $0: 腳本文件名;
                    $#: 腳本參數的個數
                    $*: 所有參數
                    $@: 所有參數   
                 --假設在腳本運行時寫了三個參數 1、2、3
                    " * " 等價于 "1 2 3"(傳遞了一個參數),
                    "@" 等價于 "1" "2" "3"(傳遞了三個參數)
                    $$: 腳本運行的當前進程ID號;
                    $!: 后臺運行的最后一個進程的ID號
 例子:
sum_scirp.sh             
#!/bin/bash
#
declare -i sum
echo "the script filename is: $0"
echo "the script argu is : $*"
echo "the script argu's number is : $#"
shift 2                     ---- 前連個參數被踢了
echo "the script argu is : $*"
echo "the script argu's number is : $#"
for ((i=1;i<=$#;i++));do    ----仿C語言風格的for循環,需要兩個括號
let sum+=$i;            ----$i,i循環的值,怎樣取傳遞參數的值$($i)?
done
echo "the sum is $sum"
    [root@localhost tmp]# bash sum_script.sh  1 2 13 14 15 16 17 18 9
the script argu is : 1 2 13 14 15 16 17 18 9
the script argu's number is : 9
the script argu is : 13 14 15 16 17 18 9    ---- shift 2 的效果
the script argu's number is : 7
the sum is 28                ---- 28=1+2+3+4+5+6+7 ,這個$i不是取傳遞參數的值!
修改for語句
    for i in $*;do
      echo "$i"
      let sum+=$i         ---- 這個$i是列表里的數據,!
    done
[root@localhost tmp]# bash  sum_script.sh  1 2 13 14 15 16 17 18 9
the script argu is : 1 2 13 14 15 16 17 18 9
the script argu's number is : 9
the script argu is : 13 14 15 16 17 18 9
the script argu's number is : 7
13
14
15
16
17
18
9
the sum is 102
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女