1、
在 bash shell 中,$( ) 與 ` ` (反引號) 都是用來做命令替換用;所謂的命令替換與變數替換差不多,都是用來重組命令列:
完成引號裡的命令列,然後將其結果替換出來,再重組命令列。例如:
$ echo the last sunday is $(date -d "last sunday" +%y-%m-%d)
在操作上,用 $( ) 或 ` ` 都無所謂,只是我"個人"比較喜歡用 $( ) ,理由是:
1) ` ` 很容易與 ' ' ( 單引號)搞混亂,尤其對初學者來說。
有時在一些奇怪的字形顯示中,兩種符號是一模一樣的(直豎兩點)。
當然了,有經驗的朋友還是一眼就能分辯兩者。只是,若能更好的避免混亂,又何樂不為呢? ^_^
2)在多層次的復合替換中,` ` 須要額外的跳脫( \` )處理,而 $( ) 則比較直觀。例如:
這是錯的:
command1 `command2 `command3` `
原本的意圖是要在 command2 `command3` 先將 command3 提換出來給 command 2 處理,
然後再將結果傳給 command1 `command2 …` 來處理。
然而,真正的結果在命令列中卻是分成了 `command2 ` 與 「 兩段。
正確的輸入應該如下:
command1 `command2 \`command3\` `
要不然,換成 $( ) 就沒問題了:
command1 $(command2 $(command3))
只要你喜歡,做多少層的替換都沒問題啦~~~ ^_^
不過,$( ) 並不是沒有斃端的…
首先,` ` 基本上可用在全部的 unix shell 中使用,若寫成 shell script ,其移植性比較高。
而 $( ) 並不見的每一種 shell 都能使用,我只能跟你說,若你用 bash2 的話,肯定沒問題… ^_^
2、$ 它其實就是用來作變數替換用的啦。
一般情況下,$var 與 $ 並沒有啥不一樣。
但是用 $ 會比較精確的界定變數名稱的範圍,比方說:
$ a=b
$ echo $ab
原本是打算先將 $a 的結果替換出來,然後再補乙個 b 字母於其後,
但在命令列上,真正的結果卻是只會提換變數名稱為 ab 的值出來…
若使用 $ 就沒問題了:
$ echo $b
bb不過,假如你只看到 $ 只能用來界定變數名稱的話,那你就實在太小看 bash 了﹗
有興趣的話,你可先參考一下 cu 本版的精華文章:
為了完整起見,我這裡再用一些例子加以說明 $ 的一些特異功能:
假設我們定義了乙個變數為:
file=/dir1/dir2/dir3/my.file.txt
我們可以用 $ 分別替換獲得不同的值:
$:拿掉第一條 / 及其左邊的字串:dir1/dir2/dir3/my.file.txt
$:拿掉最後一條 / 及其左邊的字串:my.file.txt
$:拿掉第乙個 . 及其左邊的字串:file.txt
$:拿掉最後乙個 . 及其左邊的字串:txt
$:拿掉最後條 / 及其右邊的字串:/dir1/dir2/dir3
$:拿掉第一條 / 及其右邊的字串:(空值)
$:拿掉最後乙個 . 及其右邊的字串:/dir1/dir2/dir3/my.file
$:拿掉第乙個 . 及其右邊的字串:/dir1/dir2/dir3/my
記憶的方法為:
[list]# 是去掉左邊(在鑑盤上 # 在 $ 之左邊)
% 是去掉右邊(在鑑盤上 % 在 $ 之右邊)
單一符號是最小匹配﹔兩個符號是最大匹配。[/list]
$:提取最左邊的 5 個位元組:/dir1
$:提取第 5 個位元組右邊的連續 5 個位元組:/dir2
我們也可以對變數值裡的字串作替換:
$:將第乙個 dir 提換為 path:/path1/dir2/dir3/my.file.txt
$:將全部 dir 提換為 path:/path1/path2/path3/my.file.txt
利用 $ 還可針對不同的變數狀態賦值(沒設定、空值、非空值):
$ :假如 $file 沒有設定,則使用 my.file.txt 作傳回值。(空值及非空值時不作處理)
$ :假如 $file 沒有設定或為空值,則使用 my.file.txt 作傳回值。 (非空值時不作處理)
$ :假如 $file 設為空值或非空值,均使用 my.file.txt 作傳回值。(沒設定時不作處理)
$ :若 $file 為非空值,則使用 my.file.txt 作傳回值。 (沒設定及空值時不作處理)
$ :若 $file 沒設定,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。 (空值及非空值時不作處理)
$ :若 $file 沒設定或為空值,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。 (非空值時不作處理)
$ :若 $file 沒設定,則將 my.file.txt 輸出至 stderr。 (空值及非空值時不作處理)
$ :若 $file 沒設定或為空值,則將 my.file.txt 輸出至 stderr。 (非空值時不作處理)
3、用$表示數**算。將乙個數**算寫到$符號的中括號中,中括號中的內容將先進行數**算。例如命令echo$[1+2],將輸出結果3。
4、() 和 {}
這兩個都是對一串命令的執行,但有些區別
1.()只是對一串命令重新開乙個子程序進行執行
{}是在當前程序執行
2.()和{}內的命令都是以;隔開
()最後乙個命令可以不用分號;
{}最後乙個分號需要
3.()第乙個命令不需要和括號間有空格
{}第乙個命令和左邊的括號間有空格
對於1:
$ var=10
$ (var=20;echo $var)
20$ echo $var
10說明()中執行的語句沒有呼叫當前的變數,所以是在子程序中實現
$ var=30
$ #第乙個要有空格哦
40$ echo $var
40說明var被修改了,是在同乙個程序中實現
shell中 , , 的區別
和 只在被雙引號包起來的時候才會有差異 雙引號括起來的情況 將所有的引數認為是乙個字段 以 預設為空格來劃分字段,如果空格在 裡面,不劃分。沒有括起來的情況是 和 一樣的,見到 空格 就劃分字段。是 程式的 引數個數 不包括 0 獲取上一次命令執行的返回值,一般 執行 成功 返回0。0 1 2以此類...
乙個程式演示所有的shell程式設計知識
bin sh x 由反引號括起來的也是一條命令,shell先執行該命令,然後將輸出結果立刻代換到當前命令列中。例如定義乙個變數存放date命令的輸出 echo date 命令代換也可以用 表示 echo date 如果乙個變數叫做varname,用 可以表示它的值,在不引起歧義的情況下也可以用 va...
shell中 與 的區別
命令替換 在bash中,與 反引號 都是用來作命令替換的。命令替換與變數替換差不多,都是用來重組命令列的,先完成引號裡的命令列,然後將其結果替換出來,再重組成新的命令列。exp 1 echo today is date y m d today is 2014 07 01 與 在操作上,這兩者都是達到...