1. shell變量簡介web
2. 定義變量shell
3. 使用變量express
4. 修改變量的值編程
5. 單引號和雙引號的區別bash
6. 將命令的結果賦值給變量編程語言
7. 刪除變量函數
8. 變量類型工具
9. 特殊變量列表測試
10. 退出狀態this
11. shell表達式與運算符
11.1 條件表達式
11.2 整數比較符
11.3 字符串比較符
11.4 文件測試
11.5 布爾運算符
11.6 邏輯判斷符
11.7 整數運算
11.8 其餘運算工具
11.9 shell括號用途總結
變量是任何一種編程語言都必不可少的組成部分,變量用來存放各類數據。腳本語言在定義變量時一般不須要指明類型,直接賦值就能夠,Shell 變量也遵循這個規則。
在 Bash shell 中,每個變量的值都是字符串,不管你給變量賦值時有沒有使用引號,值都會以字符串的形式存儲。
這意味着,Bash shell 在默認狀況下不會區分變量類型,即便你將整數和小數賦值給變量,它們也會被視爲字符串,這一點和大部分的編程語言不一樣。
Shell 支持如下三種定義變量的方式:
variable=value
variable='value'
variable="value"
variable 是變量名,value 是賦給變量的值。若是 value 不包含任何空白符(例如空格、Tab縮進等),那麼能夠不使用引號;若是 value 包含了空白符,那麼就必須使用引號包圍起來。使用單引號和使用雙引號也是有區別的,稍後咱們會詳細說明。
注意,賦值號的周圍不能有空格,這可能和你熟悉的大部分編程語言都不同。
Shell 變量的命名規範和大部分編程語言都同樣:
變量定義舉例:
url=http://www.baidu.com time_15_age=18 real_name='ken' _author="ken"
使用一個定義過的變量,只要在變量名前面加美圓符號$便可,如:
author="ken" echo $author echo ${author}
變量名外面的花括號{ }是可選的,加不加都行,加花括號是爲了幫助解釋器識別變量的邊界,好比下面這種狀況:
skill="Java" echo "I am good at ${skill}Script"
若是不給 skill 變量加花括號,寫成echo 「I am good at $skillScript」,解釋器就會把 $skillScript 當成一個變量(其值爲空),代碼執行結果就不是咱們指望的樣子了。推薦給全部變量加上花括號{ },這是個良好的編程習慣。
在命令行提示符直接執行 env、set 查看系統或環境變量。env 顯示用戶環境變量,set 顯示 Shell 預先定義好的變量以及用戶變量。能夠經過 export 導出成用戶變量。一些寫 Shell 腳本時經常使用的系統變量:
| $SHELL | 默認 Shell | | $HOME | 當前用戶家目錄 | | $IFS | 內部字段分隔符 | | $LANG | 默認語言 | | $PATH | 默承認執行程序路徑 | | $PWD | 當前目錄 | | $UID | 當前用戶 ID | | $USER | 當前用戶 | | $HISTSIZE | 歷史命令大小,可經過 HISTTIMEFORMAT 變量設置命令執行時間 | | $RANDOM | 隨機生成一個 0 至 32767 的整數 | | $HOSTNAME | 主機名 |
1.4.2 普通變量與臨時環境變量
普通變量定義:VAR=value
臨時環境變量定義:export VAR=value
變量引用:$VAR
下面看下他們之間區別:
Shell 進程的環境變量做用域是 Shell 進程,當 export 導入到系統變量時,則做用域是 Shell 進程及其 Shell 子進程,另開shell無效。
已定義的變量,能夠被從新賦值,如:
url="http://www.baidu.com" echo ${url} url="http://www.sina.com" echo ${url}
第二次對變量賦值時不能在變量名前加$,只有在使用變量時才能加$。
前面咱們還留下一個疑問,定義變量時,變量的值能夠由單引號’ ‘包圍,也能夠由雙引號」 「包圍,它們到底有什麼區別呢?不妨如下面的代碼爲例來講明:
#!/bin/bash url="http://c.biancheng.net" website1='C語言中文網:${url}' website2="C語言中文網:${url}" echo $website1 echo $website2
運行結果:
C語言中文網:${url}
C語言中文網:http://c.biancheng.net
以單引號’ ‘包圍變量的值時,單引號裏面是什麼就輸出什麼,即便內容中有變量和命令(命令須要反引發來)也會把它們原樣輸出。這種方式比較適合定義顯示純字符串的狀況,即不但願解析變量、命令等的場景。
以雙引號」 「包圍變量的值時,輸出時會先解析裏面的變量和命令,而不是把雙引號中的變量名和命令原樣輸出。這種方式比較適合字符串中附帶有變量和命令而且想將其解析後再輸出的變量定義。
建議:若是變量的內容是數字,那麼能夠不加引號;若是真的須要原樣輸出就加單引號;其餘沒有特別要求的字符串等最好都加上雙引號,定義變量時加雙引號是最多見的使用場景。
Shell 也支持將命令的執行結果賦值給變量,常見的有如下兩種方式:
variable=`command` variable=$(command)
第一種方式把命令用反引號包圍起來,反引號和單引號很是類似,容易產生混淆,因此不推薦使用這種方式;第二種方式把命令用$()包圍起來,區分更加明顯,因此推薦使用這種方式。
例如,我建立了一個名爲 test 的文本文件。下面的代碼中,使用 cat 命令將 log.txt 的內容讀取出來,並賦值給一個變量,而後使用 echo命令輸出。
[root@ken ~]# echo "this is ken" >test [root@ken ~]# mes=`cat test` [root@ken ~]# echo $mes this is ken
使用 unset 命令能夠刪除變量。語法:
unset variable_name
變量被刪除後不能再次使用;unset 命令不能刪除只讀變量。
舉個例子:
#!/bin/bash myUrl="http://see.xidian.edu.cn/cpp/u/xitong/" unset myUrl echo $myUrl
上面的腳本沒有任何輸出。
定義只讀變量
[root@ken ~]# name=ken [root@ken ~]# readonly name [root@ken ~]# echo $name ken [root@ken ~]# unset name -bash: unset: name: cannot unset: readonly variable
運行shell時,會同時存在三種變量:
1) 局部變量
局部變量在腳本或命令中定義,僅在當前shell實例中有效,其餘shell啓動的程序不能訪問局部變量。
2) 環境變量
全部的程序,包括shell啓動的程序,都能訪問環境變量,有些程序須要環境變量來保證其正常運行。必要的時候shell腳本也能夠定義環境變量。
3) shell變量
shell變量是由shell程序設置的特殊變量。shell變量中有一部分是環境變量,有一部分是局部變量,這些變量保證了shell的正常運行
變量 含義
$0 當前腳本的文件名 $n 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。 例如,第一個參數是$1,第二個參數是$2。 $# 傳遞給腳本或函數的參數個數。 $* 傳遞給腳本或函數的全部參數。 $? 上個命令的退出狀態,或函數的返回值。 $ 當前Shell進程ID。對於 Shell 腳本,就是這些腳本所在的進程ID。
請看下面的腳本:
#!/bin/bash echo "File Name: $0" echo "First Parameter : $1" echo "First Parameter : $2" echo "Quoted Values: $@" echo "Quoted Values: $*" echo "Total Number of Parameters : $#" 運行結果: [root@ken ~]# bash test name age File Name: test First Parameter : name First Parameter : age Quoted Values: name age Quoted Values: name age Total Number of Parameters : 2
$? 能夠獲取上一個命令的退出狀態。所謂退出狀態,就是上一個命令執行後的返回結果。
退出狀態是一個數字,通常狀況下,大部分命令執行成功會返回 0,失敗返回 1。
不過,也有一些命令返回其餘值,表示不一樣類型的錯誤。
[root@ken ~]# echo ken ken [root@ken ~]# echo $? 0 [root@ken ~]# systemctl restart jj Failed to restart jj.service: Unit not found. [root@ken ~]# echo $? 5
| 表達式 | 實例 |
| [ expression ] | [ 1 -eq 1 ] |
| [[ expression ]] | [[ 1 -eq 1 ]] |
| test expression | test 1 -eq 1 ,等同於[] |
[root@ken ~]# [ 1 -eq 2 ] && echo "this is true" || echo "this is false"
this is false
[root@ken ~]# [ 1 -eq 1 ] && echo "this is true" || echo "this is false"
this is true
注意:括號中的表達式先後都有空格,不然會報錯!
[]
[ 1 -eq 1 ]
1.條件表達式的括號裏面先後都要有空格
例子1:
[root@ken ~]# [ 1 -eq 1 ] && echo 「1」 || echo 「2」
1
例子2:
[root@ken ~]# [ 1 -eq 1 ] && echo 「1」 || echo 「2」 || echo 「3」
1
[root@ken ~]# [ 1 -eq 1 ] && echo 「1」 || echo 「2」 && echo 「3」
1
3
例子3:
[root@ken ~]# [ 1 -lt 1 ] && echo 「1」 || echo 「2」
2
註釋:
&&: 表示的含義是前面的命令執行成功,&&後面的命令纔會執行
||:表示的含義是前面的命令執行失敗,||後面的命令纔會執行
例子1: eq
[root@ken ~]# [ 1 -eq 1 ] && echo 1 || echo 2
1
例子2:ne
[root@ken ~]# [ 1 -ne 1 ] && echo 1 || echo 2
2
例子3:le
[root@ken ~]# [ 1 -le 1 ] && echo 1 || echo 2
1
例子4:ge
[root@ken ~]# [ 1 -ge 1 ] && echo 1 || echo 2
1
例子5:lt
[root@ken ~]# [ 1 -lt 1 ] && echo 1 || echo 2
2
例子6:gt
[root@ken ~]# [ 1 -gt 1 ] && echo 1 || echo 2
2
== : 判斷兩個字符串是否相等
!=: 判斷兩個字符串不相等
-n: 判斷字符串是否不爲空
-z: 判斷字符串是否爲空
注意:在判斷字符串的時候必定要加上雙引號!
例子1:==
[root@ken ~]# name=ken
[root@ken ~]# [ 「$name」 == 「ken」 ] && echo 1 || echo 2
1
例子2:!=
[root@ken ~]# [ 「$name」 != 「ken」 ] && echo 1 || echo 2
2
例子3:-n
[root@ken ~]# [ -n 「$name」 ] && echo 1 || echo 2
1
例子4:-z
[root@ken ~]# [ -z 「$name」 ] && echo 1 || echo 2
2
-e: exist 存在即爲真 #能夠判斷目錄和文件
-f: 存在且爲普通文件
-d: 存在且爲目錄
例子1:-e
[root@ken ~]# [ -e /etc/passwd ] && echo 1 || echo 2
1
[root@ken ~]# [ -e /etc/passwdd ] && echo 1 || echo 2
2
[root@ken ~]# [ -e /etc ] && echo 1 || echo 2
1
[root@ken ~]# [ -e /etcd ] && echo 1 || echo 2
2
例子2:-f
[root@ken ~]# [ -f /etc/passwd ] && echo 1 || echo 2
1
[root@ken ~]# [ -f /etc/passwdd ] && echo 1 || echo 2
2
[root@ken ~]# [ -f /etc ] && echo 1 || echo 2
2
例子3:-d
[root@ken ~]# [ -d /etc ] && echo 1 || echo 2
1
[root@ken ~]# [ -d /etc/passwd ] && echo 1 || echo 2
2
[root@ken ~]# [ -d /etc/passwddd ] && echo 1 || echo 2
2
!: 取反
-a: && 和
-o:|| 或
例子1:!
[root@ken ~]# [ ! 1 -eq 1 ] && echo 1 || echo 2
2
例子2:-a
[root@ken ~]# [ 1 -eq 1 -a 2 -lt 2 ] && echo 1 || echo 2
2
-a:
條件一: 條件二 合
true true true
true false false
false true false
false false false
例子3:-o
[root@ken ~]# [ 1 -eq 1 -o 2 -lt 2 ] && echo 1 || echo 2
1
[root@ken ~]# [ 1 -eq 2 -o 2 -lt 2 ] && echo 1 || echo 2
2
-o:
條件一: 條件二 合
true true true
true false true
false true true
false false false
第一種用法:
[root@ken ~]# [[ 1 -eq 1 && 2 -eq 2 ]] && echo 1 || echo 2
1
第二種用法:
[root@ken ~]# [ 1 -eq 1 ] && [ 2 -eq 2 ^C&& echo 1 || echo 2
&&: 前面的命令執行成功就會執行後面的命令
||: 前面的命令執行失敗就會執行後面的命令
例子1:
[root@ken ~]# num=$((24))
[root@ken ~]# echo $num
8
例子2:+
[root@ken ~]# num1=$((2+4))
[root@ken ~]# echo $num1
6
例子3:-
[root@ken ~]# num2=$((num1-4))
[root@ken ~]# echo $num2
2
例子4:/
[root@ken ~]# num3=$((num2/2))
[root@ken ~]# echo $num3
1
例子5:%
[root@ken ~]# num4=$((5%2))
[root@ken ~]# echo $num4
1
例子6:
[root@ken ~]# num5=$((52))
[root@ken ~]# echo $num5
25
例子7:
[root@ken ~]# num6=$((3/2))
[root@ken ~]# echo $num6
1
自加一
寫法一:推薦寫法
[root@ken ~]# num=1
[root@ken ~]# let num++
[root@ken ~]# echo $num
2
寫法二:
[root@ken ~]# let num+=1
[root@ken ~]# echo $num
3
寫法三:
[root@ken ~]# let num=num+1
[root@ken ~]# echo $num
4
例子2:
[root@ken ~]# let num+=2
[root@ken ~]# echo $num
6
例子1:
[root@ken ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty’.
1+1
2
3*6
18
例子2:
[root@ken ~]# echo 「1+1」 | bc
2