bash的工作特殊之命令執行狀態返回值和命令展開所涉及的內容及其示例
什么是Bash 什么是Shell Bash 是 GNU Bourne-Again SHell,是目前大多數Linux發行版采用的Shell。
Shell 是 *nix提供給用戶使用的界面。
一個操作系統的底層是獨立運行的,用戶界面和底層分開,可以最大限度的保證系統穩定。Shell就是一個特殊的程序,負責接受用戶的命令,並把系統的響應返回給用戶。
Bash Shell一般不需要自己安裝,在安裝發行版的同時都會安裝好。
Shell的存在是和登陸相關的,從用戶名密碼驗證通過以后,Shell就啟動了,知道你退出,Shell就結束了運行。
除了Bash Shell之外,還有很多其他的Shell。
1、bash基本語法
下面看一個簡單的shell文件(HelloWorld.sh):
#!/bin/bash
#This is an example
echo Hello World
(1)“#!”是說明這個文件類型的,Linux系統根據“#!”及其后面的字符串確定該文件的類型,/bin/bash表名該文件是一個bash程序,需要由/bin目錄下的bash程序來解釋執行。bash程序一般放在/Bin目錄下,可以用命令“locate bash”,“whereis bash”,“find / -name bash >/dev/null”來找出bash安裝位置。
(2)“#”是bash文件的注釋,表示以#開頭的一行是注釋信息;echo是回顯命令,將其后的內容輸出到標准輸出。Bash程序中絕大部分語句結束時沒有分號。
(3)執行bash程序:sh HelloWorld.sh 或者./HelloWorld.sh(需要有可執行權限)
bash變量
bash中的變量是不能含有保留字,不能含有“-”等保留字符,也不能含有空格。
在bash中,變量是不需要提前定義的,只要前面沒有被定義過,就可以直接使用。一般使用變量的第一條語句是賦初值,若不賦初值,默認為NULL。
例子:
#!/bin/bash
#This is an example
STR="Hello World"
echo $STR
(1)變量賦值時,“=”號左右兩邊都不能有空格。
(2)bash語句不需要分號(“;”)結尾。
(3)除了變量賦值和在for語句循環頭中,bash變量在使用時都需要加“$”。
(4)Bash程序是在一個新的進程中運行,該程序中的變量命名,賦值和使用不會影響其他進程或者原始shell變量已存在的值(相當於C++中的局部變量作用域?)
(5)以單引號括起來的變量將不再被解釋為變量,如'$STR'將被解釋為一個字符串。更為標准的變量引用方式是“${變量名}”,例子中是省略了{}的簡化寫法。在復雜的程序中,為了不引起歧義,一般要加上“{}”。
(6)bash變量沒有類型的分別,一個變量可以被定義為字符串,也可以再被定為為整數,取決於變量的用途。
例子:
#!/bin/bash
x=1999
let "x=$x+1"
echo $x #輸出2000
x=expr $x+1
echo $x #輸出2000+1
x="Hello"$x
echo $x #輸出Hello2000+1
在shell中對整數變量的運算有“+ - * / %”,一般通過let和expr這兩個指令來實現(但從上面的例子可以看到,let進行的是整數運算,expr進行的是字符串替換)。
(7)在比較操作上,整數變量和字符串變量不同:
操作 整數 字符串
相同 -eq =
不同 -ne !=
大於 -gt >
小於 -lt <
大於或等於 -ge
小於或等於 -le
為空 -z
不為空 -n
如:
比較字符串變量a和b是否相等就寫作:if [$a=$b]
比較整數變量a和b是否相等寫作:if [$a -eq $b]
(8)除了整數和字符串之外,bash變量還可以作為文件變量操作。bash中沒有浮點數運算。
運算符
含義( 滿足下面要求時返回 TRUE )
-e file 文件 file 已經存在
-f file 文件 file 是普通文件
-s file 文件 file 大小不為零
-d file 文件 file 是一個目錄
-r file 文件 file 對當前用戶可以讀取
-w file 文件 file 對當前用戶可以寫入
-x file 文件 file 對當前用戶可以執行
-g file 文件 file 的 GID 標志被設置
-u file 文件 file 的 UID 標志被設置
-O file 文件 file 是屬於當前用戶的
-G file 文件 file 的組 ID 和當前用戶相同
file1 -nt file2 文件 file1 比 file2 更新
file1 -ot file2 文件 file1 比 file2 更老
file,file1,和file2代表文件路徑。
3.局部變量
在bash程序中,如果用了一個變量,該變量到程序的結尾一致有效。
局部變量存在於一個局部程序塊中,只要在賦初值時加上local關鍵字,就可以聲明一個局部變量。
例子:
#!/bin/bash
HELLO=Hello
funtion hello{
local HELLO=World
echo $HELLO
}
echo $HELLO
hello
echo $HELLO
該程序的執行結果是:
Hello
World
Hello
4.函數
function my_funcname {
code block
}
my_funcname() {
code block
}
(1)左邊的寫法“{” 之前要有空格,否則會有錯誤:syntax error near unexpected token `echo'
(2)函數的參數並不需要在定義時就指定,只需要通過bash保留變量$1,$2……來引用就可以了。
(3)函數的返回值可以用return語句來制定返回一個特定的整數,如果沒有指定,則返回最后一條語句的執行結果(成功返回0,失敗返回錯誤代碼)。函數的返回值通過“$?”保留字來獲得。BASH要求返回值必須為一個整數,不能有return語句返回字符串變量。
例子:square.sh
#!/bin/bash
square(){
let "res=$1*$1"
return $res
}
square $1
result=$?
echo $result
exit 0
bash命令執行狀態返回值
在bash中使用一個特殊的變量$?來保存上一個命令的執行狀態結果。 (變量$的取值范圍在0-255之間)
主要之含義:
0:正常結束
1:通用執行錯誤
2:誤用shell命令
126:命令不可執行
127:命令未找到
128:無效退出參數
130:被ctrl-c強行中止
255:退出狀態碼越界
*在0-255范圍內的所有值只有返回值為0是表示成功。
例:
exit $?
127
通過命令exit $?獲取bash的返回值為127
bash命令展開
以某些bash能夠解釋的符號來代替命令中的某些參數。
~:展開為用戶的家目錄;
例:切換至家目錄
cd ~;pwd
/root
{}:可承載一個以逗號分隔的列表,並將其展開為多個路徑;
例:在/tmp/d目錄下創建f1,f2,f3三個文件
touch /tmp/d/f{1,2,3}
bash
附:
bash特性之命令別名
獲取當前用戶可用的別名的定義:
這里寫圖片描述
bash的特性之命令歷史
命令語法格式:
history [-c] [-d OFFSET] [n]
history -anrw [FILENAME]
history -ps VALUE [VALUE…]
-c: 清空命令歷史;
-d offset(偏移量):刪除指定命令歷史,offset為history顯示出來的命令數字
-r: 從文件讀取命令歷史至歷史列表中;
-w:把歷史列表中的命令追加至歷史文件中;
history #:顯示最近的#條命令;
bash特性之快捷鍵
Ctrl+a:跳轉至命令行行首
Ctrl+e:跳轉至命令行行尾
Ctrl+u:刪除行首至光標所在處之間的所有字符;
Ctrl+k:刪除光標所在處至行尾的所有字符;
Ctrl+l:清屏,相當於clear
bash的特性之命令補全和路徑補全
1.命令查找和補全機制:
(1) 查找內部命令;
(2) 根據PATH環境變量中設定的目錄,自左而右逐個搜索目錄下的文件名;
(3) 給定開頭的部分字符串如果能惟一標識某命令程序文件,則直接補全;
不能惟一標識某命令程序文件,再擊tab鍵一次,會給出列表;
2.路徑補全
在給定起始路徑下,以對應路徑下的打頭字串逐一匹配起始路徑下每個文件:
TAB按鍵;
如果能惟一標識,則直接補全;
否則,再一次tab,給出列表;
3.命令行展開
~:自動展開為用戶的家目錄,或指定的用戶的家目錄;
{}:花括號展開。可承載一個以逗號分隔的路徑列表,並能夠將其展開為多個路徑;