shell腳本編程基礎
1、基本格式
首先在編寫shell的開始要聲明一下該shell所用的腳本類型,我們也稱為shebang機制
eg: #!/bin/bash # Description ...
2、bash中的變量的種類
(1)、本地變量 生效范圍: 當前shell進程,對當前shell之外的進程及子進程均無效 (2)、環境變量 生效范圍: 當前shell進程及其子進程 變量聲明 export name=Value declare -x name=Value 變量撤銷 unset name 變量引用 $name 或 ${name} 顯示所有的環境變量 env 、export、declare -x 、printenv (3)、局部變量 生效范圍: 當前shell進程中某片代碼段(通常指函數) (4)、位置變量: 用$1 $2 $3 ... 來表示,用于腳本中調用傳遞給它的參數 只讀變量: 只能聲明,但不能修改和刪除 聲明變量 readonly name declare -r name 查看只讀變量 readonly -p (5)、特殊變量: $? $0 $* $@ $# $$ $? 檢查上一條命令是否執行成功 echo $? 成功為0 非0不成功 $0 表示命令本身 $# 表示傳遞給腳本的參數個數 $* 傳遞給腳本的所有參數 "$*" 將全部參數合并為一個字符串 $@ 傳遞給腳本的所有參數 "$@" 每個參數為單獨的字符串 $$ 顯示當前自己的進程編號 (6)、在shell中() {}的區別 (): 表示在當前shell的子進程中再開一個進程 {}: 不在當前的shell進程中開子進程,順序執行 eg: [root@Centos6 ~]#x=abc;(echo $x;x=def;echo $x);echo $x abc def abc [root@Centos6 ~]#x=abc;{ echo $x;x=def;echo $x; };echo $x abc def def
3、算數運算
(1)、算數運算 包括: + - \* / % ** 實現算術運算: let Var=expression [root@Centos6 ~]#a=100 [root@Centos6 ~]#b=200 [root@Centos6 ~]#let c=a+b [root@Centos6 ~]#echo $c 300 Var=$[expression] [root@Centos6 ~]#c=$[a+b] [root@Centos6 ~]#echo $c 300 Var=$((expression)) Var=$(expr arg1 arg2 ...) 注: 參數間要有空格 [root@Centos6 ~]#c=$(expr $a + $b) [root@Centos6 ~]#echo $c 300 declare -i Var=Value echo "expression" | bc bash中有內建的隨機數生成器 echo "$[$RANDOM%100]" : 生成0-99之間的隨機數 [root@Centos6 ~]#echo "$[$RANDOM%100]" 53 (2)、賦值 增強型賦值: += -= *= /= %= eg: let a+=5 ==》a=a+5 其中 ++a : a先自加1后在賦值給a a++ : 先賦值后自加1
4、條件測試
(1)、條件判斷
判斷方法: test expression [ expression ] 注意: 表達式與[]間要有空格,不支持正則表達式 [[ expression ]] 支持正則表達式 判斷一個參數是否被賦值 [ "$a" ] echo $? 0為被賦值 非0未被賦值 短路與 && eg: CMD1 && CMD2 CMD1為真CMD2才執行 短路或 || eg: CMD1 || CMD2 CMD1為假CMD2才執行 與 -a 或 -o 非 -not 或!
(2)、字符串判斷
字符串 : == :是否等于 > :ASCII碼是否大于 < :ASCII碼是否小于 != :是否不等于 =~ :左側字符串能否被右側的PATTERN所匹配 注:此表達式一般用于[[ ]];擴展的正則表達式 eg: [[ $a =~ ^-?[0-9]+$ ]] 判斷$a是否為數字(正數、負數、0) [ -z "$a" ] 空為真 [ -n "$a" ] 非空為真
(3)、文件存在性判斷
文件判斷: -a file : -e file : 文件是否存在,存在為真,反之為假 eg : [ -e "file" ] 所屬類別: -b file:是否存在且為塊設備文件 -c file:是否存在且為字符設備文件 -d file:是否存在且為目錄文件 -f file:是否存在且為普通文件 -h | -L file:是否存在且為連接文件 -p file:是否存在且為管道文件 -S file:是否存在且為套接字文件 權限類: -r file:是否存在r權限的文件 -w file:是否存在w權限的文件 -x file:是否存在x權限的文件 -u file:是否存在suid權限的文件 -g file:是否存在sgid權限的文件 -k file:是否存在sticky權限的文件 文件大小: -s file: 文件是否存在且非空 雙目測試: file1 -ef file2 :file1與file2是否指向同一個設備上的inode file1 -nt file2 :file1是否新于file2 file1 -ot file2 :file1是否舊于file2
5、read命令接受參數的輸入
從標準輸入中讀取值,給每個單詞分配一個變量,剩余的單詞都被分配給最后一個變量 -p :指定要顯示的信息 -s :靜默輸入 -d :指定輸入的結束符 -t#:超時時間 eg : read -p "Please input a arguement" aaa 特殊用法: read a b c <<< "xxx yyy zzz"可以將值附給a b c
原創文章,作者:M25_ymd,如若轉載,請注明出處:http://www.www58058.com/83609