shell程式中 還有 的區別

2021-06-22 01:47:12 字數 3145 閱讀 5324

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 與 在操作上,這兩者都是達到...