国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
shell 十三問(wèn)之第八問(wèn):$(( )) 與 $( ) 還有${ }

shell 十三問(wèn)?

8) $(( )) 與 $( ) 還有${ } 差在哪?

我們上一章介紹了 ( ) 與 { } 的不同,這次讓我們擴(kuò)展一下,看看更多的變化:$( ) 與 ${ } 又是啥玩意兒呢?

在 bash shell 中,$( ) 與 ` ` (反引號(hào)) 都是用來(lái)做命令替換用(command substitution)的。
所謂的命令替換與我們第五章學(xué)過(guò)的變量替換差不多,都是用來(lái)重組命令行:
* 完成引號(hào)裡的命令行,然後將其結(jié)果替換出來(lái),再重組命令行。
例如:
  1. $ echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)
復(fù)制代碼

如此便可方便得到上一星期天的日期了... ^_^

在操作上,用 $( ) 或 ` ` 都無(wú)所謂,只是我"個(gè)人"比較喜歡用 $( ) ,理由是:

1,  ` ` 很容易與 ' ' ( 單引號(hào))搞混亂,尤其對(duì)初學(xué)者來(lái)說(shuō)。
有時(shí)在一些奇怪的字形顯示中,兩種符號(hào)是一模一樣的(直豎兩點(diǎn))。
當(dāng)然了,有經(jīng)驗(yàn)的朋友還是一眼就能分辯兩者。只是,若能更好的避免混亂,又何樂(lè)不為呢? ^_^

2, 在多層次的復(fù)合替換中,` ` 須要額外的跳脫( \` )處理,而 $( ) 則比較直觀。例如:
這是錯(cuò)的:
  1. command1 `command2 `command3` `
復(fù)制代碼

原本的意圖是要在 command2 `command3` 先將 command3 提換出來(lái)給 command 2 處理,
然後再將結(jié)果傳給 command1 `command2 ...` 來(lái)處理。
然而,真正的結(jié)果在命令行中卻是分成了 `command2 ` 與 `` 兩段。
正確的輸入應(yīng)該如下:
  1. command1 `command2 \`command3\` `
復(fù)制代碼


要不然,換成 $( ) 就沒(méi)問(wèn)題了:
  1. command1 $(command2 $(command3))
復(fù)制代碼

只要你喜歡,做多少層的替換都沒(méi)問(wèn)題啦~~~  ^_^

不過(guò),$( ) 並不是沒(méi)有斃端的...
首先,` ` 基本上可用在全部的 unix shell 中使用,若寫(xiě)成 shell script ,其移植性比較高。
而 $( ) 並不見(jiàn)的每一種 shell 都能使用,我只能跟你說(shuō),若你用 bash2 的話,肯定沒(méi)問(wèn)題...  ^_^

接下來(lái),再讓我們看 ${ } 吧... 它其實(shí)就是用來(lái)作變量替換用的啦。
一般情況下,$var 與 ${var} 並沒(méi)有啥不一樣。
但是用 ${ } 會(huì)比較精確的界定變量名稱的範(fàn)圍,比方說(shuō):
  1. $ A=B
  2. $ echo $AB
復(fù)制代碼

原本是打算先將 $A 的結(jié)果替換出來(lái),然後再補(bǔ)一個(gè) B 字母於其後,
但在命令行上,真正的結(jié)果卻是只會(huì)提換變量名稱為 AB 的值出來(lái)...
若使用 ${ } 就沒(méi)問(wèn)題了:
  1. $ echo ${A}B
  2. BB
復(fù)制代碼


不過(guò),假如你只看到 ${ } 只能用來(lái)界定變量名稱的話,那你就實(shí)在太小看 bash 了﹗
有興趣的話,你可先參考一下 cu 本版的精華文章:
http://www.chinaunix.net/forum/viewtopic.php?t=201843

為了完整起見(jiàn),我這裡再用一些例子加以說(shuō)明 ${ } 的一些特異功能:
假設(shè)我們定義了一個(gè)變量為:
file=/dir1/dir2/dir3/my.file.txt
我們可以用 ${ } 分別替換獲得不同的值:
${file#*/}:拿掉第一條 / 及其左邊的字串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最後一條 / 及其左邊的字串:my.file.txt
${file#*.}:拿掉第一個(gè) .  及其左邊的字串:file.txt
${file##*.}:拿掉最後一個(gè) .  及其左邊的字串:txt
${file%/*}:拿掉最後條 / 及其右邊的字串:/dir1/dir2/dir3
${file%%/*}:拿掉第一條 / 及其右邊的字串:(空值)
${file%.*}:拿掉最後一個(gè) .  及其右邊的字串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一個(gè) .  及其右邊的字串:/dir1/dir2/dir3/my
記憶的方法為:
    # 是去掉左邊(在鑑盤上 # 在 $ 之左邊)
    % 是去掉右邊(在鑑盤上 % 在 $ 之右邊)
    單一符號(hào)是最小匹配﹔兩個(gè)符號(hào)是最大匹配。

${file:0:5}:提取最左邊的 5 個(gè)字節(jié):/dir1
${file:5:5}:提取第 5 個(gè)字節(jié)右邊的連續(xù) 5 個(gè)字節(jié):/dir2

我們也可以對(duì)變量值裡的字串作替換:
${file/dir/path}:將第一個(gè) dir 提換為 path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:將全部 dir 提換為 path:/path1/path2/path3/my.file.txt

利用 ${ } 還可針對(duì)不同的變數(shù)狀態(tài)賦值(沒(méi)設(shè)定、空值、非空值):
${file-my.file.txt} :假如 $file 沒(méi)有設(shè)定,則使用 my.file.txt 作傳回值。(空值及非空值時(shí)不作處理)
${file:-my.file.txt} :假如 $file 沒(méi)有設(shè)定或?yàn)榭罩?,則使用 my.file.txt 作傳回值。 (非空值時(shí)不作處理)
${file+my.file.txt} :假如 $file 設(shè)為空值或非空值,均使用 my.file.txt 作傳回值。(沒(méi)設(shè)定時(shí)不作處理)
${file:+my.file.txt} :若 $file 為非空值,則使用 my.file.txt 作傳回值。 (沒(méi)設(shè)定及空值時(shí)不作處理)
${file=my.file.txt} :若 $file 沒(méi)設(shè)定,則使用 my.file.txt 作傳回值,同時(shí)將 $file 賦值為 my.file.txt 。 (空值及非空值時(shí)不作處理)
${file:=my.file.txt} :若 $file 沒(méi)設(shè)定或?yàn)榭罩担瑒t使用 my.file.txt 作傳回值,同時(shí)將 $file 賦值為 my.file.txt 。 (非空值時(shí)不作處理)
${file?my.file.txt} :若 $file 沒(méi)設(shè)定,則將 my.file.txt 輸出至 STDERR。 (空值及非空值時(shí)不作處理)
${file:?my.file.txt} :若 $file 沒(méi)設(shè)定或?yàn)榭罩?,則將 my.file.txt 輸出至 STDERR。 (非空值時(shí)不作處理)

tips:
以上的理解在於, 你一定要分清楚 unset 與 null 及 non-null 這三種賦值狀態(tài).
一般而言, : 與 null 有關(guān), 若不帶 : 的話, null 不受影響, 若帶 : 則連 null 也受影響.


還有哦,${#var} 可計(jì)算出變量值的長(zhǎng)度:
${#file} 可得到 27 ,因?yàn)?/dir1/dir2/dir3/my.file.txt 剛好是 27 個(gè)字節(jié)...

接下來(lái),再為大家介稍一下 bash 的組數(shù)(array)處理方法。
一般而言,A="a b c def" 這樣的變量只是將 $A 替換為一個(gè)單一的字串,
但是改為 A=(a b c def) ,則是將 $A 定義為組數(shù)...
bash 的組數(shù)替換方法可參考如下方法:
  1. ${A[@]} 或 ${A[*]}
復(fù)制代碼
可得到 a b c def (全部組數(shù))
  1. ${A[0]}
復(fù)制代碼
可得到 a (第一個(gè)組數(shù)),${A[1]} 則為第二個(gè)組數(shù)...
  1. ${#A[@]} 或 ${#A[*]}  
復(fù)制代碼
可得到 4 (全部組數(shù)數(shù)量)
  1. ${#A[0]}
復(fù)制代碼
可得到 1 (即第一個(gè)組數(shù)(a)的長(zhǎng)度),${#A[3]} 可得到 3 (第四個(gè)組數(shù)(def)的長(zhǎng)度)
  1. A[3]=xyz  
復(fù)制代碼
則是將第四個(gè)組數(shù)重新定義為 xyz ...

諸如此類的....
能夠善用 bash 的 $( ) 與 ${ } 可大大提高及簡(jiǎn)化 shell 在變量上的處理能力哦~~~  ^_^

好了,最後為大家介紹 $(( )) 的用途吧:它是用來(lái)作整數(shù)運(yùn)算的。
在 bash 中,$(( )) 的整數(shù)運(yùn)算符號(hào)大致有這些:
+ - * / :分別為 "加、減、乘、除"。
% :餘數(shù)運(yùn)算
& | ^ !:分別為 "AND、OR、XOR、NOT" 運(yùn)算。

例:
  1. $ a=5; b=7; c=2
  2. $ echo $(( a+b*c ))
  3. 19
  4. $ echo $(( (a+b)/c ))
  5. 6
  6. $ echo $(( (a*b)%c))
  7. 1
復(fù)制代碼


在 $(( )) 中的變量名稱,可於其前面加 $ 符號(hào)來(lái)替換,也可以不用,如:
$(( $a + $b * $c)) 也可得到 19 的結(jié)果

此外,$(( )) 還可作不同進(jìn)位(如二進(jìn)位、八進(jìn)位、十六進(jìn)位)作運(yùn)算呢,只是,輸出結(jié)果皆為十進(jìn)位而已:
echo $((16#2a)) 結(jié)果為 42 (16進(jìn)位轉(zhuǎn)十進(jìn)位)
以一個(gè)實(shí)用的例子來(lái)看看吧:
假如當(dāng)前的  umask 是 022 ,那麼新建文件的權(quán)限即為:
  1. $ umask 022
  2. $ echo "obase=8;$(( 8#666 & (8#777 ^ 8#$(umask)) ))" | bc
  3. 644
復(fù)制代碼


事實(shí)上,單純用 (( )) 也可重定義變量值,或作 testing:
a=5; ((a++)) 可將 $a 重定義為 6
a=5; ((a--)) 則為 a=4
a=5; b=7; ((a < b)) 會(huì)得到  0 (true) 的返回值。
常見(jiàn)的用於 (( )) 的測(cè)試符號(hào)有如下這些:
    <:小於
    >:大於
    <=:小於或等於
    >=:大於或等於
    ==:等於
    !=:不等於

不過(guò),使用 (( )) 作整數(shù)測(cè)試時(shí),請(qǐng)不要跟 [ ] 的整數(shù)測(cè)試搞混亂了。(更多的測(cè)試我將於第十章為大家介紹)

怎樣?好玩吧..  ^_^  okay,這次暫時(shí)說(shuō)這麼多...
上面的介紹,並沒(méi)有詳列每一種可用的狀態(tài),更多的,就請(qǐng)讀者參考手冊(cè)文件囉...
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
shell之文件路徑截取
謎格介紹
神經(jīng)的放鬆最後統(tǒng)統(tǒng)在腦
Linux
經(jīng)典的 Shell 十三問(wèn)
不知道怎么寫(xiě)度量值,試試這個(gè)方法!
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服