• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統(tǒng)計(jì)

            最新評(píng)論

            shell中$(( )) 與 $( ) 還有${ }的區(qū)別

            $( ) 與 ` ` (反引號(hào))
            在 bash shell 中,$( ) 與 ` ` (反引號(hào)) 都是用來做命令替換用(command substitution)的。

            所謂的命令替換與我們第五章學(xué)過的變量替換差不多,都是用來重組命令行:
            * 完成引號(hào)里的命令行,然后將其結(jié)果替換出來,再重組命令行。
            例如:
            [code]$ echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)[/code]
            如此便可方便得到上一星期天的日期了… ^_^

            用 $( ) 的理由:

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

            2, 在多層次的復(fù)合替換中,` ` 須要額外的跳脫( \` )處理,而 $( ) 則比較直觀。例如:
            這是錯(cuò)的:
            [code]command1 `command2 `command3` `[/code]
            原本的意圖是要在 command2 `command3` 先將 command3 提換出來給 command 2 處理,
            然后再將結(jié)果傳給 command1 `command2 …` 來處理。
            然而,真正的結(jié)果在命令行中卻是分成了 `command2 ` 與 “ 兩段。
            正確的輸入應(yīng)該如下:
            [code]command1 `command2 \`command3\` `[/code]

            要不然,換成 $( ) 就沒問題了:
            [code]command1 $(command2 $(command3))[/code]
            只要你喜歡,做多少層的替換都沒問題啦~~~   ^_^

            $( ) 的不足:
            1. ` ` 基本上可用在全部的 unix shell 中使用,若寫成 shell script ,其移植性比較高。
            而 $( ) 并不見的每一種 shell 都能使用,我只能跟你說,若你用 bash2 的話,肯定沒問題…   ^_^

            ${ } 用來作變量替換。
            一般情況下,$var 與 ${var} 并沒有啥不一樣。
            但是用 ${ } 會(huì)比較精確的界定變量名稱的范圍,比方說:
            $ A=B
            $ echo $AB
            原本是打算先將 $A 的結(jié)果替換出來,然后再補(bǔ)一個(gè) B 字母于其后,
            但在命令行上,真正的結(jié)果卻是只會(huì)提換變量名稱為 AB 的值出來…
            若使用 ${ } 就沒問題了:
            $ echo ${A}B
            BB

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

            為了完整起見,我這里再用一些例子加以說明 ${ } 的一些特異功能:
            假設(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
            記憶的方法為:
            [list]# 是去掉左邊(在鑒盤上 # 在 $ 之左邊)
            % 是去掉右邊(在鑒盤上 % 在 $ 之右邊)
            單一符號(hào)是最小匹配﹔兩個(gè)符號(hào)是最大匹配。[/list]
            ${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ì)不同的變量狀態(tài)賦值(沒設(shè)定、空值、非空值): 
            ${file-my.file.txt} :假如 $file 沒有設(shè)定,則使用 my.file.txt 作傳回值。(空值及非空值時(shí)不作處理) 
            ${file:-my.file.txt} :假如 $file 沒有設(shè)定或?yàn)榭罩担瑒t使用 my.file.txt 作傳回值。 (非空值時(shí)不作處理)
            ${file+my.file.txt} :假如 $file 設(shè)為空值或非空值,均使用 my.file.txt 作傳回值。(沒設(shè)定時(shí)不作處理)
            ${file:+my.file.txt} :若 $file 為非空值,則使用 my.file.txt 作傳回值。 (沒設(shè)定及空值時(shí)不作處理)
            ${file=my.file.txt} :若 $file 沒設(shè)定,則使用 my.file.txt 作傳回值,同時(shí)將 $file 賦值為 my.file.txt 。 (空值及非空值時(shí)不作處理)
            ${file:=my.file.txt} :若 $file 沒設(shè)定或?yàn)榭罩担瑒t使用 my.file.txt 作傳回值,同時(shí)將 $file 賦值為 my.file.txt 。 (非空值時(shí)不作處理)
            ${file?my.file.txt} :若 $file 沒設(shè)定,則將 my.file.txt 輸出至 STDERR。 (空值及非空值時(shí)不作處理)
            ${file:?my.file.txt} :若 $file 沒設(shè)定或?yàn)榭罩担瑒t將 my.file.txt 輸出至 STDERR。 (非空值時(shí)不作處理)

             

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

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

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

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

            例:
            $ a=5; b=7; c=2
            $ echo $(( a+b*c ))
            19
            $ echo $(( (a+b)/c ))
            6
            $ echo $(( (a*b)%c))
            1

            在 $(( )) 中的變量名稱,可于其前面加 $ 符號(hào)來替換,也可以不用,如:
            $(( $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í)用的例子來看看吧:
            假如當(dāng)前的   umask 是 022 ,那么新建文件的權(quán)限即為:
            $ umask 022
            $ echo "obase=8;$(( 8#666 & (8#777 ^ 8#$(umask)) ))" | bc
            644

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

            posted on 2011-01-06 09:55 大龍 閱讀(933) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            亚洲国产成人久久一区久久| 2020国产成人久久精品| 久久99精品国产99久久| 人妻无码αv中文字幕久久| 国产精品岛国久久久久| 久久国产成人精品麻豆| 亚洲精品久久久www| 精品少妇人妻av无码久久| 嫩草影院久久99| 亚洲欧美精品一区久久中文字幕 | 久久久久久久精品成人热色戒| 2020久久精品亚洲热综合一本| 国产国产成人精品久久| 久久亚洲国产成人影院网站 | 久久综合九色综合久99| 久久夜色精品国产噜噜亚洲AV| 久久精品亚洲乱码伦伦中文| 色婷婷综合久久久久中文一区二区 | 国产成人精品久久| 久久亚洲精品人成综合网| 久久久久久久尹人综合网亚洲| 国产69精品久久久久观看软件| 国产精品福利一区二区久久| 久久SE精品一区二区| 久久国产精品一区| 久久精品无码一区二区三区| 久久天天躁狠狠躁夜夜躁2O2O| 亚洲国产成人精品女人久久久 | 久久棈精品久久久久久噜噜| 2021国内久久精品| 亚洲国产日韩欧美综合久久| 国产三级精品久久| 久久精品国产91久久综合麻豆自制| 亚洲精品乱码久久久久久久久久久久 | 久久精品国产亚洲AV不卡| 久久福利青草精品资源站免费| 欧美亚洲色综久久精品国产| 奇米综合四色77777久久| 亚洲中文字幕无码久久综合网| 婷婷国产天堂久久综合五月| 国内精品伊人久久久久妇|