1.變量定義
變量命名規則:
可以包含字母,數字,下劃線,首字母不能用數字開頭,中間不能又空格;
為變量賦值等號之間不能為空格;
變量命名不能使用標點符號,不能使用bash的關鍵字;
shell中默認的變量的類型都是字符,就算是數字字符也會被認為是字符串,如果需要進行數值相加,則必須指定變量為數值;
如果定義的變量中沒有空格,則定義變量時可以使用單引號或雙引號,也可以使用,如:
name=zs
,如果變量中包含了空格,則必須使用單引號或雙引號引起來,如:"Kent Beck”
;可以使用命令的結果作為變量的值,但必須使用 `` 或 $() 符號,如: d=$(ls /etc) 獲取etc目錄下的所用文件賦給d;
環境變量一般用大寫,編程習慣;
變量命令示例:
# 以下時合法的變量名
ABC
ROOT__PATH
_var
var2# 以下時非法的變量名
12abc
?abc
1.1.變量賦值
# 顯示負值
name="zs" #正確
name = "zs" #錯誤
# 變量的使用
echo $name
echo ${name} #也可以這樣寫,花括號是可選的
# 使用語句為變量賦值
for f in $(ls /etc) # 將/etc目錄下的所有文件循環賦給f變量
for f in `ls /etc` # 這樣寫也可以
# 變量可以重新定義
name="ww"
echo $name
name="zl"
echo $name?
雙引號和單引號的區別?
root@zking:~# var=1 2 3
2: command not found
root@zking:~# VAR="1 2 3"
root@zking:~# echo $VAR
1 2 3
root@zking:~# VAR='1 2 3'
root@zking:~# echo $VAR
1 2 3
root@zking:~# ^C
root@zking:~#??
?
在變量賦值時,如果值有空格,Shell 會把空格后面的字符串解釋為命令。
看不出什么區別,再舉個說明:
root@zking:~# N=3
root@zking:~# VAR="1 2 $N"
root@zking:~# echo $VAR
1 2 3?
單引號是告訴
Shell
忽略特殊字符,而雙引號則解釋特殊符號原有的意義,比如$、!。 ?
1.2.只讀變量
# 定義只讀變量,該變量不能修改
name="avdfd"
readonly name
# 運行時會提示該變量是只讀變量?
?
1.3.刪除變量
# 刪除v1變量
unset v1
# set可以查看所有的變量,包括環境變量和用戶自定義的變量
set?
刪除只讀變量?
1.4.變量引用
Shell
中所有變量引用使用$符,后跟變量名。
root@zking:~# VAR=123
root@zking:~# echo $VAR
123
root@zking:~# VAR+=456
root@zking:~# echo $VAR
123456?
還有時候變量名與其他字符串緊礙著,也會誤認為是整個變量:
root@zking:~# VAR=123
root@zking:~# echo $VAR
123
root@zking:~# echo $VAR456root@zking:~# echo ${VAR}456
123456
將命令結果作為變量值:
root@zking:~# VAR=`echo 123`
root@zking:~# echo $VAR
123
root@zking:~# VAR=$(echo 123)
root@zking:~# echo $VAR
123?
?
2.變量類型
自定義變量:用戶自己定義的變量,或者叫作本地變量;
環境變量:保存和系統操作環境相關的變量,可以添加環境變量;
位置變量:主要用于向腳本中傳遞參數或數據,變量名不能自定義,作用固定;
預定義變量:在Bash中已經定義好的變量,變量的作用也是預先定義好的;
2.1.自定義變量
用戶自定義的變量也叫本地變量,只在定義它的當前shell中才也可以使用。
參考變量定義中的變量賦值即可。
2.2.環境變量
在命令行提示符直接執行 env、set
查看系統或環境變量。env
顯示用戶環境變量,set
顯示Shell預先定義好的變量以及用戶變量。可以通過 export
導出成用戶變量。
可以理解為環境變量與本地變量的區別就是作用范圍不同。
?
一些寫 Shell 腳本時常用的系統變量:
變量 | 說明 |
---|---|
$SHELL | 默認 Shell |
$HOME | 當前用戶家目錄 |
$IFS | 內部字段分隔符 |
$LANG | 默認語言 |
$PATH | 默認可執行程序路徑 |
$PWD | 當前目錄 |
$UID | 當前用戶 ID |
$USER | 當前用戶 |
$HISTSIZE | 歷史命令大小,可通過 HISTTIMEFORMAT 變量設置命令執行時間 |
$RANDOM | 隨機生成一個 0 至 32767 的整數 |
$HOSTNAME | 主機名 |
export
是一個Shell內置命令,用于將變量設置為環境變量,使其在當前Shell及其子Shell中都能被訪問。環境變量通常用于配置Shell環境、系統行為、應用程序參數等。基本語法:
export VARIABLE_NAME=value
?
2.3.位置變量
位置變量指的是函數或腳本后跟的第 n 個參數。
參數 | 說明 |
---|---|
$n | n是數字,$0表示命令的本身,$1-9表示第1到第9個參數,10以上的參數需要用{}括起來,例如${10} |
$* | 表示命令行中的所有參數,$*把所有參數看成一個整體 |
$@ | 表示命令行中的所用參數,與$*不同的是$@把每個參數區分對待,可以將這個整體看作是一個數組,數組中的每個元素都是獨立的 |
$# | 代表命令行中所有參數的個數 |
示例一: ?
root@zking:~# vim paramdemo.sh
#!/bin/bash
echo $0
echo $1
echo $2
echo $3# 賦權
root@zking:~# chmod 755 paramdemo.sh?
root@zking:~# ./paramdemo.sh 1 2 3 4
./paramdemo.sh
1
2
3
?
示例二: ?
root@zking:~# vim paramdemo02.sh
#!/bin/bash
echo "參數個數:$#"
echo "所有的參數(作為一個整體):$*"
echo "所有的參數(區分對待每個參數):$@"root@zking:~#?
root@zking:~# chmod 775 paramdemo02.sh
root@zking:~# ./paramdemo02.sh 1 2 3 4 7
參數個數:5
所有的參數(作為一個整體):1 2 3 4 7
所有的參數(區分對待每個參數):1 2 3 4 7
?
2.4.預定義變量
參數 | 說明 |
---|---|
$? | 最后一次執行命令的返回狀態,如值為0則說明成功,如值為非0,則說明命令執行不正確 |
$$ | 當前進程的進程號 |
$! | 后臺運行的最后一個進程的進程號 |
?
?
示例一:
root@zking:~# ls
a.txt ?paramdemo02.sh ?paramdemo.sh ?snap ?workspace
root@zking:~# echo $?
0
root@zking:~# ls /fafaf
ls: cannot access '/fafaf': No such file or directory
root@zking:~#?
root@zking:~# echo $?
2?
?
3.鍵盤輸入
read
命令從標準輸入讀取,并把輸入的內容復制給變量。
命令:read [選項] [變量名]?
參數說明:
選項 | 說明 |
---|---|
-p | 提示信息,等待輸入時的提示 |
-t | 秒數,用于指定等待的時間,單位時秒 |
-n | 字符數,只要接收到指定的字符數就會執行 |
-s | 隱藏輸入的數據,用于機密信息的輸入,比如密碼 |
更多參數,請使用
read -help
查看。
?
?
示例一:
root@zking:~# vim readdemo.sh
#!/bin/bash
read -t 60 -p "請輸入賬號: " userName
echo "輸入的賬號是: $userName"
read -s -t 60 -p "請輸入密碼:" password
echo -e "\n"
echo “輸入的密碼: $password”
read -n 1 -t 30 -p "請選擇[y/n]" select
echo -e "\n"
echo "輸入的選擇是: $select"root@zking:~# chmod 775 readdemo.sh?
root@zking:~# ./readdemo.sh?
請輸入賬號: admin
輸入的賬號是: admin
請輸入密碼:“輸入的密碼: 1234”
請選擇[y/n]y輸入的選擇是: y?
?
4.數值運算
4.1.為什么數值需要特殊處理
在shell
中變量默認都是字符型的,不管是其字面值是不是數值,所以當兩個變量相加時,默認是字符串拼接的操作,例如:
root@zking:~# num1=1
root@zking:~# num2=2
root@zking:~# num3=$num1+$num2
root@zking:~# echo $num3
1+2?
4.2.聲明變量類型
格式: declare [+/-][選項] 變量名?
參數說明:
參數 | 說明 |
---|---|
- | 給變量設置類型屬性 |
+ | 取消變量的類型屬性,注意與我們的日常習慣不同 |
-i | 將變量指定為整型 |
-x | 將變量聲明為環境變量 |
-p | 顯示指定變量被設置的類型 |
?
示例一:
root@zking:~# num1=1
root@zking:~# num2=2
root@zking:~# num3=$num1+$num2
root@zking:~# echo $num3
1+2
# 此處是數值相加,而不是字符串相加了
root@zking:~# declare -i num4=$num1+$num2
root@zking:~# echo $num4
3?
4.3. expr或let數值運算工具
除了 Shell
本身的算數運算表達式,還有幾個命令支持復雜的算數運算:
root@zking:~# a=1
root@zking:~# b=2
root@zking:~# let c=$a+$b
root@zking:~# echo $c
3# 注意空格問題
root@zking:~# c=$(expr $a+$b)
root@zking:~# echo $c
1+2
root@zking:~# c=$(expr $a + $b)
root@zking:~# echo $c
3
?
4.4.$((表達式))或$[表達式]
root@zking:~# a=5
root@zking:~# b=6
root@zking:~# c=$((a+b))
root@zking:~# echo $c
11
root@zking:~# b=8
root@zking:~# a=9
root@zking:~# c=$[a+b]
root@zking:~# echo $c
17?
5.運算符
優先級 | 運算符 | 說明 |
---|---|---|
1 | =, +=, -=, *=, /=, %=, &=, ^= | 各種賦值 |
2 | && | 邏輯與 |
3 | ^ | 按位異或 |
4 | & | 按位與 |
5 | ==, != | 等于,不等于 |
6 | >, <, <=, >= | 大于,小于,大于等于,小于等于 |
7 | >>, << | 按位左移,按位右移 |
8 | +, - | 加,減 |
9 | *, /, % | 乘,除,取余 |
10 | !, ~ | 邏輯非,按位取反,或補碼 |
11 | -,+ | 單目,正負運算符 |
優先級的數值越大,優先級越高,注意和其他語言的數值越低優先級越高不同。 ?
root@zking:~# num=$[(15+34)*5/2]
root@zking:~# echo $num
122
root@zking:~# b=$((19%2))
root@zking:~# echo $b
1
root@zking:~# c=$((1&&0))
root@zking:~# echo $c
0?
?
空格總結
定義變量時,=號兩邊不可以留空格
使用反引號的時候,運算符兩邊必須留空格;使用$()的時候,運算符兩邊不可以留空格
if條件測試語句的時候,[ ]兩邊要留空格,比較符兩邊也要留空格
命令和其之后的參數或對象之間一定要有空格
$后不能有空格