1、顯示腳本參數
我們可以在執行 Shell 腳本時,向腳本傳遞參數,腳本內獲取參數的格式為:$n。n 代表一個數字,1 為執行腳本的第一個參數,2 為執行腳本的第二個參數,以此類推……(本質上屬於變量替換)
- 實例:
#!/bin/bash
echo "向shell腳本傳遞參數!";
echo "執行的文件名:$0";
echo "第一個參數為:$1";
echo "第二個參數為:$2";
為腳本設置可執行權限,並執行腳本,輸出結果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2
向shell腳本傳遞參數!
執行的文件名:./test.sh
第一個參數為:1
第二個參數為:2
常用參數
參數 | 說明 |
---|---|
$# | 傳遞給shell腳本的參數個數 |
$* | 以一個單字符串顯示所有向shell腳本傳遞的參數。比如在雙引號中的 $* 會以"$1 $2 … $n"的形式輸出所有參數。 |
$@ | 與$*相同,但是在引號中返回每個參數。比如在雙引號中的 $@ 會以"$1" "$2" … "$n" 的形式輸出所有參數。 |
$$ | 腳本運行的當前進程ID號 |
$? | 顯示最后命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。 |
$* 與 $@ 區別:
- 相同點:都是引用所有參數。
- 不同點:只有在雙引號中體現出來。假設在腳本運行時寫了三個參數 1、2、3,,則 " * " 等價於 "1 2 3"(傳遞了一個參數),而 "@" 等價於 "1" "2" "3"(傳遞了三個參數)。
#!/bin/bash
echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
done
echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done
執行腳本,輸出結果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3
2、:獲取 變量 與 環境變量 的值
在linux及unix的shell中,以 $ 開頭的字符串表示的是shell中定義的變量,這些變量可以是系統自動增加的,也可以是用戶自己定義的。
$PATH 表示的是系統的命令搜索路徑,和windows的%path%是一樣的, $HOME則表示是用戶的主目錄,也就是用戶登錄后工作目錄
3、${}變量替換
${}用於變量替換。一般情況下,$var 與${var} 並沒有啥不一樣。但是用 ${} 會比較精確的界定變量名稱的范圍。比如原本是打算先將 $A 的結果替換出來,然后再補一個 B 字母於其后,但在命令行上,真正的結果卻是只會提換變量名稱為 AB 的值,若使用 ${ } 就沒問題了:
[root@localhost ~]# A=B
[root@localhost ~]# echo $AB
[root@localhost ~]# echo ${A}B
BB
[root@localhost ~]#
${}功能擴展之獲取路徑、文件名、后綴
實例:
先賦值一個變量為一個路徑,如下:
file=/dir1/dir2/dir3/my.file.txt
[root@localhost ~]# file=/dir1/dir2/dir3/my.file.txt
[root@localhost ~]# echo ${file}
/dir1/dir2/dir3/my.file.txt
[root@localhost ~]#
命令 | 命令解釋 | 輸出結果 |
---|---|---|
$ | 去掉第一個 / 及其前面(左側)的字符串 | dir1/dir2/dir3/my.file.txt |
$ | 去掉最后一個 / 及其前面(左側)的字符串 | my.file.txt |
$ | 去掉第一個 . 及其前面(左側)的字符串 | file.txt |
$ | 去掉最后一個 . 及其前面(左側)的字符串 | txt |
$ | 去掉最后一個 / 及其后面(右側)的字符串 | /dir1/dir2/dir3 |
${file%%/* | 去掉第一個 / 及其后面(右側)的字符串 | |
${file%.* | 去掉最后一個 . 及其后面(右側)的字符串 | /dir1/dir2/dir3/my.file |
${file%%.* | 去掉第一個 . 及其后面(右側)的字符串 | /dir1/dir2/dir3/my |
記憶方法如下:
- “#”是去掉左邊(在鍵盤上 # 在 $ 之左邊)
- “%”是去掉右邊(在鍵盤上 % 在 $ 之右邊)
- “*”是用來匹配不要的字符,也就是想要去掉的那部分
${}功能擴展之取子串和替換
[root@localhost ~]# echo ${file}
/dir1/dir2/dir3/my.file.txt
命令 | 命令解釋 | 輸出結果 |
---|---|---|
$ | 從第一個字符(下標:0)開始取5個字符 | /dir1 |
$ | 從第6個字符(下標:5)開始取5個字符 | /dir2 |
$ | 將第一個dir替換成path | /path1/dir2/dir3/my.file.txt |
$ | 將全部dir替換成path | /path1/path2/path3/my.file.txt |
$ | 獲取字符串長度 | 27 |
4、$()命令替換
$()和反引號``都是命令替換功能符號,反引號 (`) 位於鍵盤的Tab鍵的上方,1鍵的左方。注意與單引號(')位於Enter鍵的左方的區別。在Linux中起着命令替換的作用。命令替換是指shell能夠將一個命令的標准輸出插在一個命令行中任何位置。
[root@localhost home]# echo the date is `date` #shell會執行反引號中的date命令,把結果插入到echo命令中。
the date is Mon May 24 19:15:13 PDT 2021
[root@localhost home]#
注:在操作上,$()和反引號``都是達到相應的效果,但是建議使用$(),理由如下:
- ``很容易與''搞混亂。
- 在多層次的復合替換中,``必須要額外的跳脫處理(反斜線),而$( )比較直觀。
示例: - 將cmd1執行結果作為cmd2參數,再將cmd2結果作為cmd3的參數
cmd3 $(cmd2 $(cmd1))
- 如果是用反引號,直接引用是不行的,還需要作跳脫處理
cmd3 `cmd2 \`cmd1\``
最后,$( )的弊端是,並不是所有的類unix系統都支持這種方式,但反引號是肯定支持的。
5、進行數學運算
$[] $(())它們是一樣的,都是進行數學運算的。支持+ - * / %分別為 “加、減、乘、除、取模”。但是注意,bash只能作整數運算,對於浮點數是當作字符串處理的。(( ))及[[ ]]它們分別是[]的針對 數學比較表達式 和 字符串表達式 的加強版。
在** [[ ]]中增加了另一個特性:模式匹配。(( ))**,不需要再將表達式里面的大小於符號轉義,除了可以使用標准的數學運算符外,還增加了以下符號: