基礎知識:
變量: 變量名+指向的內存空間; 變量賦值: 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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。