本文總結了Linux中的$符號的各種用法
用法一:
顯示腳本參數($0、$?、$*、$@、$#、$$、$!)(本質上屬於變量替換)
$0:就是該bash文件名,個位數的,可直接使用數字,但兩位數以上,則必須使用 {} 符號來括住,如${10}.
$?:是上一指令的返回值,成功是0,不成功是1。一般來說,UNIX(linux) 系統的進程以執行系統調用exit() 來結束的。這個回傳值就是status值。回傳給父進程,用來檢查子進程的執行狀態。一般指令程序倘若執行成功,其回傳值為 0;失敗為 1。
$*:所有腳本參數的內容:就是調用調用本bash shell的參數。
$@:基本上與上面相同。只不過是“$*”返回的是一個字符串,字符串中存在多外空格。 “$@”返回多個字符串。
$#:返回所有腳本參數的個數。
$$ :Shell本身的PID(ProcessID),即當前進程的PID。
$! :Shell最后運行的后台Process的PID
$- :使用Set命令設定的Flag一覽
示例:
# touch variable
# vi variable
腳本內容如下:
#!/bin/sh
echo "number:$#"
echo "scname:$0"
echo "first :$1"
echo "second:$2"
echo "argume:$@"
保存退出
賦予腳本執行權限
# chmod +x variable
執行腳本
# ./variable aa bb
number:2
scname:./variable
first: aa
second:bb
argume:aa bb
通過顯示結果可以看到:
$# 是傳給腳本的參數個數
$0 是腳本本身的名字
$1是傳遞給該shell腳本的第一個參數
$2是傳遞給該shell腳本的第二個參數
$@ 是傳給腳本的所有參數的列表
用法二:
獲取變量與環境變量的值
如:path=2,則echo $path 或者echo${path}顯示的就是path的值。
在linux及unix的sh中,以$開頭的字符串表示的是sh中定義的變量,這些變量可以是系統自動增加的,也可以是用戶自己定義的$PATH表示的是系統的命令搜索路徑,和windows的%path%是一樣的$HOME則表示是用戶的主目錄,也就是用戶登錄后工作目錄
示例:echo $PATH.
用法三:
shell中$(( ))、$( )、``與${ }的區別
說明:
${ }這種形式其實與用法一和二是一樣的,屬於變量替換的范疇,只不過在變量替換中可以加上大括號,也可以不加大括號。
簡而言之:$(( ))屬於執行計算公式,等價於$[ ],$( )和` `屬於命令替換,${ }屬於變量替換
(1)$( )與``(反引號):返回括號中命令的結果
在bash中,$( )與` `(反引號)都是用來作命令替換的,執行括號或者反引號中的命令。
命令替換與變量替換差不多,都是用來重組命令行的,先完成引號里的命令行,然后將其結果替換出來,再重組成新的命令行
示例:命令:$ echo today is $(date "+%Y-%m-%d"),顯示:today is 2014-07-01
注:在操作上,這兩者都是達到相應的效果,但是建議使用$( ),理由如下:
1)``很容易與''搞混亂,尤其對初學者來說。
2)在多層次的復合替換中,``必須要額外的跳脫處理(反斜線),而$( )比較直觀。
最后,$( )的弊端是,並不是所有的類unix系統都支持這種方式,但反引號是肯定支持的。
示例:
1# 將cmd1執行結果作為cmd2參數,再將cmd2結果作為cmd3的參數
cmd3 $(cmd2 $(cmd1))
2 # 如果是用反引號,直接引用是不行的,還需要作跳脫處理
cmd3 `cmd2 \`cmd1\``
(2)${ }變量替換
一般情況下,$var與${var}是沒有區別的,但是用${ }會比較精確的界定變量名稱的范圍
示例:
取路徑、文件名、后綴
先賦值一個變量為一個路徑,如下:
file=/dir1/dir2/dir3/my.file.txt

記憶方法如下:
-
# 是去掉左邊(在鍵盤上 # 在 $ 之左邊)
-
% 是去掉右邊(在鍵盤上 % 在 $ 之右邊)
-
單一符號是最小匹配;兩個符號是最大匹配
-
*是用來匹配不要的字符,也就是想要去掉的那部分
-
還有指定字符分隔號,與*配合,決定取哪部分



