shell 腳本編程基礎

timg

六、shell腳本編程

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 }

不同點:小括號開啟子shell,不影響當前的shell環境,大括號不開啟shell,影響當前的shell環境 共同點:都是做為一個整體,把括號里的多個命令統一執行 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

 

6.2bash腳本編程之算術運算

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}:先將掃描將內含的變量替換為其值,然后再執行

1)使用let 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完全相同

4)使用expr 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

 

6.3bash腳本編程之條件判斷

? &&(短路與)和&(邏輯與):有假則為假,全真則為真 ||(短路或)和|(邏輯或):有真則為真,全假則為假

? 邏輯與和短路與的區別: 邏輯與的判斷方式是:從左到右依次判斷,直到結尾(邏輯全程運算) 短路與的判斷方式是: 從左到右依次判斷,直到出現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

? 短路或 :||

!非:取相反的結果(!true為false,!false的結果為true) (!True即false;!false即true)

? 亦或:^ 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:判斷一個字符串是否不空

6.4bash腳本編程之test測試

? 條件測試: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 #為真

var=haha [ -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

(1)
what?what?
上一篇 2018-05-01
下一篇 2018-05-01

相關推薦

  • 在CentOS 7.3中創建本地yum源

    1.掛載系統光盤 1.1創建掛載文件 [root@centos7?~]#?mkdir?/mnt/cdrom??????????????????????????#創建文件 1.2掛載光驅 [root@centos7?~]#?mount?/dev/cdrom?/mnt/cdrom/??????????????#掛載光驅? mount:?/dev/sr0?is?w…

    Linux筆記 2017-05-18
  • 網絡管理-第二篇

    IP地址 它們可唯一標識 IP 網絡中的每臺設備 每臺主機(計算機、網絡設備、外圍設備)必須具有唯一的地址 IP地址由兩部分組成: 網絡ID: 標識網絡 每個網段分配一個網絡ID 主機 ID: 標識單個主機 由組織分配給各設備 MAC地址沒有管理性 IP地址可管理性標識性高 子網掩碼標識網絡ID和主機ID 地址分類 二進制 A類地址:前八位是網絡ID 1-1…

    2018-05-03
  • cp 常用選項

    cp 選項:

    Linux筆記 2018-04-01
  • LInux系統誤將chmod 權限改成了000如何恢復?

    需要解決方法的可直接跳躍至最后“解決方法目”;
    解決方法用到了新學的靈活權限設置 ACL,正文對Linux權限,和ACL用法做了詳細解釋。

    2018-04-06
  • VM虛擬機克隆中的網絡問題

    使用VM中的虛擬機克隆,可以很方便的搭建一些實驗或生成環境,但在克隆時應注意幾個問題: 1、網絡 一般在克隆后,配置好的網絡地址都會保留,需要重新對克隆的機器更改IP地址和hostname 具體更改方法為: IP地址:使用vi編輯 /etc/sysconfig/network-scripts/ifcfg-eno16777736文件,將ip地址更改為需要的ip…

    Linux筆記 2018-05-08
欧美性久久久久