6.1bash腳本編程之變量
? 作業提交地址:scp N wang@172.20.102.77:home/wang/bin
? 執行腳本的方法: 以bash程序來執行: bash hello.sh或cat hello.sh |bash 直接指令下達: 加權限:chmod +x hello.sh 絕對路徑:/home/hello.sh 相對路徑:./hello.sh bash -n f1.sh #語法錯誤 bash -x f1.sh #執行調試
1、shell腳本入門和算述運算進階
shell之變量 環境變量 在本shell與子shell中有效 export name=VALUE declare -x name=VALUE 本地變量 生效范圍為當前shell進程中某代碼片斷,通常指函數 key=VAL 局部變量(標準變量、普通變量) 生效范圍為當前shell進程;對當前shell之外的其它shell進程,包括當前shell的子shell進程均無效 local key=VAL ( name=mage;echo $name) { name=mage;echo $name; } (ls;pwd) { ls;pwd }
共同點:都是做為一個整體,把括號里的多個命令統一執行 x=1;echo “pid=?;echo “subx=?x”);echo x=$x pid=2887 subpid=2887 subx2=2 x=1 ? 位置變量(特殊變量):在腳本代碼中調用通過命令行傳遞給腳本的參數 ?2, …:對應第1、第2等參數,shift [n]換位置 $0: 命令本身 $*: 傳遞給腳本的所有參數,全部參數合為一個字符串 $@: 傳遞給腳本的所有參數,每個參數為獨立字符串 $#: 傳遞給腳本的參數的個數 ?* 只在被雙引號包起來的時候才會有差異 $?:代碼執行返回值 $$:腳本或程序啟動使用的PID set — 清空所有位置變量 ? 變量的傳遞: N=NAME NAME=wang N1=${!N} eval N2=$$N //進行兩次調用 ? arg.sh
shell之計算
? 算數運算: bash中的算術運算:help let +, -, *, /, %取模(取余), **(乘方) 實現算術運算:
(1) let var=算術表達式 (2) var=$[算術表達式] (3) var=$((算術表達式)) (4) var=$(expr arg1 arg2 arg3 …) (5) declare –i var = 數值 (6) echo ‘算術表達式’ | bc 乘法符號有些場景中需要轉義,如* bash有內建的隨機數生成器:$RANDOM(0-32767) echo ?RANDOM%50] :0-49之間隨機數 let VAL1{+|-|*|/|**|%}VAL2 expr VAL1 {+|-|*|/|**|%} VAL2 $[VAL1{+|-|*|/|**|%}] eval echo {1..$1}:先將掃描將內含的變量替換為其值,然后再執行
var=1 let “var+=1” echo $var
? x=10 y=20 z=?y let z=x+y a)參數在表達式中直接訪問,不必加$ b)一般情況下算數表達式可以不加雙引號,但是若表達式中有bash中的關鍵字則需加上 c)let后的表達式只能進行整數運算
2)使用$[] var=1 var=?var+1] echo $var 輸出結果位2 a)$[]將中括號內的表達式作為數學運算先計算結果再輸出 b)對中的變量進行訪問時前面需要加? c)$[]支持的運算符與let相同,但也只支持整數運算
3)使用(()) var=1 ((var+=1)) echo $var 輸出結果為2 (())的使用方法與let完全相同
var=1 var=expr $var + 1
echo $var 輸出結果為2 a)expr后的表達式個符號間需用空格隔開 b)expr支持的操作符有: |、&、<、<=、=、!=、>=、>、+、-、*、/、% c)expr支持的操作符中所在使用時需用\進行轉義的有:|、&、<、<=、>=、>、* e)expr同樣只支持整數運算 5)使用bc(可以進行浮點數計算) var=1 var=echo "$var+1"|bc
echo $var 輸出結果為2
? &&(短路與)和&(邏輯與):有假則為假,全真則為真 ||(短路或)和|(邏輯或):有真則為真,全假則為假
? 邏輯與和短路與的區別: 邏輯與的判斷方式是:從左到右依次判斷,直到結尾(邏輯全程運算) 短路與的判斷方式是: 從左到右依次判斷,直到出現false為止將不再判斷,直接得到結果為false(短路遇false就停)
? 邏輯與:& 0&0=0 0&1=0 1&0=0 1&1=1
? 短路與 :&& 0&&0=0 0&&1=0 1&&0=0 1&&1=1 cmd1 && cmd2 cmd1為假,cmd2不需要執行,反之cmd1為真,需要執行cmd2
? 邏輯或和短路或的區別 : 邏輯或的判斷方式是:從左到右依次判斷,直到結尾 短路或的判斷方式是: 從左到右依次判斷,直到出現true為止將不再判斷,直接得到結果為true
? 邏輯或: 0||0=0 0||1=0 1||0=0 1||1=1
? 短路或 :||
? 亦或:^ 0^1=1 0^0=0 1^0=1 1^1=0 操作數相同則為真,操作數不同則為假 示例: a=2 b=3 let c=a+b echo $c
? a=5;b=6;echo a=?[a^b];a=?a $b shell之比較
? =,==,!=:比較字符串是否相同 -e:判斷一個文件是否存在 -f:判斷一個文件是否是一個普通文件 -d:判斷一個文件是否是一個目錄 -L:判斷一個文件是否是一個軟鏈接文件 -S:判斷一個文件是否是一個socket文件 -z:判斷一個字符串是否為空 -n:判斷一個字符串是否不空
? 條件測試:test =[ ] 長格式的例子: test “?B” && echo “Strings are equal” test “?B” && echo “Integers are equal” 簡寫格式的例子: [ “?B” ] && echo “Strings are equal” [ “?B” ] && echo “Integers are equal” ? test支持對字符串string、數字運算(arithmetic tests)、文件file的操作, ture echo $? 0 false echo $? 1
數字測試:
? eq 相等; -ne 不等 ;-lt 小于 ; -le 小于等于 ;gt 大于 ;ge 大于等于
? m=10 n=20 [ ?n ] && echo equal | | echo no equal no equal n=10 [ ?n ] && echo equal | | echo no equal equal
? 變量如果在中括號中一般加雙引號 [“?b”],避免出問題
? == 是否等于 > ascii碼是否大于ascii碼 < 是否小于 != 是否不等于 =~ 左側字符串是否能夠被右側的PATTERN所匹配 注意: 此表達式一般用于[[ ]]中;擴展的正則表達式 -z “STRING“ 字符串是否為空,空為真,不空為假 -n “STRING“ 字符串是否不空,不空為真,空為假 ? 注意:用于字符串比較時的用到的操作數都應該使用引號 ? str1=aaa str2=bbb test ?str2 (等號前后有空格) echo $? 1 #為假 str2=aaa test ?str2 echo $? 0 #為真 等價于[ ]的寫法 [ ?str2 ] echo $? 0 #為真
? 判斷字符串長度是否為空:($?) 不為空,為真,顯示0;為空,為假,顯示1 [ -z $var ] echo $? 0 #為真
[ -z $var ] echo $? 1 #為假,不為空 (zero) [ “abc” ] echo $? 0 #為真,不為空 [ “” ] echo $? 1 #空,為假 [ ] echo $? 1 #空 為假 [ 0 ] echo $? 0 #不為空,為真 判斷兩個字符串、變量是否相同: x=haha y=hehe [ “?y” ] echo $? 1
? x=haha;y=haha; [ “?y” ] && echo equal equal x=haha;y=haha; [ “?y” ] && echo equal | | echo no equal equal x=haha;y=hehe; [ “?y” ] && echo equal | | echo no equal no equal
? ? 存在性測試 -a FILE:同-e -e FILE: 文件存在性測試,存在為真,否則為假 ? 存在性及類別測試 -b FILE:是否存在且為塊設備文件 -c FILE:是否存在且為字符設備文件 -d FILE:是否存在且為目錄文件 -f FILE:是否存在且為普通文件 -h FILE 或 -L FILE:存在且為符號鏈接文件 -p FILE:是否存在且為命名管道文件 -S FILE:是否存在且為套接字文件 判斷是否為文件夾: [ -d /etc/ ] && echo true true [ -d /etc/redhat-release ] && echo true(加粗為文件,非文件夾) [ -d /bin/ ] && echo true true [ -L /bin ] && echo true (軟鏈接) true
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/97317