shell中的 $ 符號用法 以及( ) 、 (( )) 、 [ ] 、[[ ]]區別。


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只能作整數運算,對於浮點數是當作字符串處理的。(( ))[[ ]]它們分別是[]的針對 數學比較表達式 和 字符串表達式 的加強版。
在** [[ ]]中增加了另一個特性:模式匹配。(( ))**,不需要再將表達式里面的大小於符號轉義,除了可以使用標准的數學運算符外,還增加了以下符號:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM