變量
定義變量
- 定義變量時芥喇,變量名不加美元符號
- 量名和等號之間不能有空格
- 首個字符必須為字母(a-z,A-Z)
- 中間不能有空格凰萨,可以使用下劃線(_)
- 不能使用標(biāo)點符號
- 不能使用 bash 里的關(guān)鍵字
使用變量
只要在變量名前面加美元符號($)
變量名可加上花括號继控,幫助解釋器識別變量邊界(推薦加上)
重新定義變量
直接為變量賦值即可
# 定義變量
[root@bogon ~]# username="張三"
# 使用變量
[root@bogon ~]# echo $username
張三
[root@bogon ~]# echo ${username}
張三
# 重新賦值
[root@bogon ~]# username="李四"
只讀變量
只讀變量不可以被修改,采用readonly 修飾
# 定義變量后修飾
[root@bogon ~]# username="李四"
[root@bogon ~]# readonly username
[root@bogon ~]# username="張三"
-bash: username: readonly variable
# 定義變量時修飾
[root@bogon ~]# readonly address="beijing"
[root@bogon ~]# address="shanghai"
-bash: address: readonly variable
刪除變量
直接采用unset 即可
[root@bogon ~]# myurl="www.baidu.com"
[root@bogon ~]# unset myurl
變量類型
1) 局部變量
局部變量在腳本或命令中定義沟蔑,僅在當(dāng)前 shell 實例中有效湿诊。
2) 環(huán)境變量
所有的程序,都能訪問環(huán)境變量瘦材。
3) shell 變量
shell 變量中有一部分是環(huán)境變量厅须,有一部分是局部變量。
Shell 特殊變量
特殊變量列表:
變量 | 含義 |
---|---|
$0 | 當(dāng)前腳本的文件名 |
$n | 傳遞給腳本或函數(shù)的參數(shù)食棕。n 是一個數(shù)字朗和,表示第幾個參數(shù)。 |
$# | 傳遞給腳本或函數(shù)的參數(shù)個數(shù)簿晓。 |
$* | 傳遞給腳本或函數(shù)的所有參數(shù)眶拉。 |
$@ | 傳遞給腳本或函數(shù)的所有參數(shù)。被雙引號(" ")包含時憔儿,與 $* 稍有不同忆植。 |
$? | 上個命令的退出狀態(tài),或函數(shù)的返回值。 |
$$ | 當(dāng)前 Shell 進(jìn)程 ID朝刊。對于 Shell 腳本耀里,就是這些腳本所在的進(jìn)程 ID。 |
?和 @ 的區(qū)別:
?和@ 都表示傳遞給函數(shù)或腳本的所有參數(shù)拾氓,當(dāng)它們被雙引號(" ")包含時冯挎,"?"會將所有的參數(shù)作為一個整體,以"1 2…n"的形式輸出所有參數(shù)咙鞍;"@"會將各個參數(shù)分開房官,以"1" "2"…"n" 的形式輸出所有參數(shù)。
[root@bogon ~]# cat ./scripts/args.sh
#!/bin/bash
echo "*打印"
for var in "$*"
do
echo "$var"
done
echo "@打印"
for var in "$@"
do
echo "$var"
done
[root@bogon ~]# sh ./scripts/args.sh zhansan lisi wangwu zhaoliu tianqi
*打印
zhansan lisi wangwu zhaoliu tianqi
@打印
zhansan
lisi
wangwu
zhaoliu
tianqi
退出狀態(tài)
$?
可以獲取上一個命令的退出狀態(tài)续滋。所謂退出狀態(tài)翰守,就是上一個命令執(zhí)行后的返回結(jié)果。
退出狀態(tài)是一個數(shù)字吃粒,一般情況下潦俺,大部分命令執(zhí)行成功會返回0,失敗返回1徐勃。
轉(zhuǎn)義字符
加上-e
參數(shù)即可
[root@bogon ~]# cat ./scripts/test.sh
#!/bin/bash
lang="java"
echo "hello $lang \n"
echo -e "hello $lang \n"
[root@bogon ~]# sh ./scripts/test.sh
hello java \n
hello java
命令替換
[root@bogon ~]# DATE=`date`
[root@bogon ~]# echo $DATE
2017年 06月 17日 星期六 13:18:44 CST
[root@bogon ~]# USERS=`who | wc -l`
[root@bogon ~]# echo $USERS
3
[root@bogon ~]# cat ./scripts/test.sh
#!/bin/bash
ISSUEINFO=`cat /etc/issue`
echo $ISSUEINFO
[root@bogon ~]# sh ./scripts/test.sh
CentOS release 6.5 (Final) Kernel \r on an \m
變量替換
變量替換可以根據(jù)變量的狀態(tài)(是否為空事示、是否定義等)來改變它的值
形式 | 說明 |
---|---|
${var} | 變量值 |
${var:-word} | 變量 var 為空或已被刪除(unset),返回 word僻肖,不改變 var 的值肖爵。 |
${var:=word} | 變量 var 為空或已被刪除(unset),返回 word臀脏,并將 var 的值設(shè)置為 word劝堪。 |
${var:?message} | 變量 var 為空或已被刪除(unset),將消息 message 送到標(biāo)準(zhǔn)錯誤輸出揉稚。 |
${var:+word} | 變量 var 被定義秒啦,返回 word,不改變 var 的值搀玖。 |
運算符
算數(shù)運算符
+ 加法
- 減法
* 乘法
/ 除法
% 取余
= 賦值
== 相等余境。
!= 不相等。
關(guān)系運算符
-eq 檢測兩個數(shù)是否相等灌诅,相等返回 true芳来。
-ne 檢測兩個數(shù)是否相等,不相等返回 true猜拾。
-gt 檢測左邊的數(shù)是否大于右邊的即舌,如果是,則返回 true挎袜。
-lt 檢測左邊的數(shù)是否小于右邊的顽聂,如果是肥惭,則返回 true。
-ge 檢測左邊的數(shù)是否大等于右邊的芜飘,如果是务豺,則返回 true。
-le 檢測左邊的數(shù)是否小于等于右邊的嗦明,如果是,則返回 true蚪燕。
布爾運算符
! 非運算娶牌,表達(dá)式為 true 則返回 false,否則返回 true馆纳。
-o 或運算诗良,有一個表達(dá)式為 true 則返回 true。
-a 與運算鲁驶,兩個表達(dá)式都為 true 才返回 true鉴裹。
字符串運算符
= 檢測兩個字符串是否相等,相等返回 true钥弯。
!= 檢測兩個字符串是否相等径荔,不相等返回 true。
-z 檢測字符串長度是否為0脆霎,為0返回 true总处。
-n 檢測字符串長度是否為0,不為0返回 true睛蛛。
str 檢測字符串是否為空鹦马,不為空返回 true。
文件測試運算符
文件測試運算符用于檢測 Unix 文件的各種屬性忆肾。
-b file 檢測文件是否是塊設(shè)備文件荸频,如果是,則返回 true客冈。
-c file 檢測文件是否是字符設(shè)備文件旭从,如果是,則返回 true郊酒。
-d file 檢測文件是否是目錄遇绞,如果是,則返回 true燎窘。
-f file 檢測文件是否是普通文件(既不是目錄摹闽,也不是設(shè)備文件),如果是褐健,則返回 true付鹿。
-g file 檢測文件是否設(shè)置了 SGID 位澜汤,如果是,則返回 true舵匾。
-k file 檢測文件是否設(shè)置了粘著位(Sticky Bit)俊抵,如果是,則返回 true坐梯。
-p file 檢測文件是否是具名管道徽诲,如果是,則返回 true吵血。
-u file 檢測文件是否設(shè)置了 SUID 位谎替,如果是,則返回 true蹋辅。
-r file 檢測文件是否可讀钱贯,如果是,則返回 true侦另。
-w file 檢測文件是否可寫秩命,如果是,則返回 true褒傅。
-x file 檢測文件是否可執(zhí)行弃锐,如果是,則返回 true樊卓。
-s file 檢測文件是否為空(文件大小是否大于0)拿愧,不為空返回 true。
-e file 檢測文件(包括目錄)是否存在碌尔,如果是浇辜,則返回 true。
Shell注釋
注釋:以“#
”開頭的行唾戚,會被解釋器忽略柳洋。