• <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>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
            我一下子也想不起該起什么標(biāo)題,就取了這樣一個(gè)不太合適的標(biāo)題。
            在這里我想說(shuō)的是幾種shell里的小括號(hào),大括號(hào)結(jié)構(gòu)和有括號(hào)的變量,命令的用法,如下:
            PHP 代碼:
            1.${var}
            2.$(cmd)
            3.(){}
            4.${var:-string},${var:+string},${var:=string},${var:?string}
            5.$((exp))
            6.$(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern) 
            現(xiàn)在分述如下:
            1.Shell中變量的原形:${var}
            大家常見(jiàn)的變量形式都是$var,如
            PHP 代碼:
            $ var=test
            $ echo $var
            test 
            但當(dāng)你要顯示變量值加隨意的字符(我這里用AA)時(shí),就會(huì)出錯(cuò),如下:
            PHP 代碼:
            $ echo $varAA


            這時(shí)應(yīng)該用變量的原形:${var},即是加一個(gè)大括號(hào)來(lái)限定變量名稱的范圍,如下
            PHP 代碼:
            $ echo ${var}AA
            testAA

            以這個(gè)特性,我們可以很方便地寫(xiě)一個(gè)批量改后綴名的程序,我把它命名為mymv,程序如下:
            PHP 代碼:
            #!/bin/bash
             
            tail=$1
            for filename in `ls`
            do
               
            mv $filename ${filename}.$tail
            done 
            程序需要提供一個(gè)后綴名,如c,表示改為后綴為c的C程序文件,看下面的測(cè)試:
            PHP 代碼:
            ls
            a b c
            mymv c
            ls
            a
            .c b.c c.c

            看樣子程序運(yùn)行的很好,但這是不完善的程序,有2個(gè)要注意的問(wèn)題:
            A,目錄下沒(méi)有子目錄,如果有一個(gè)目錄,假設(shè)為dir,則也會(huì)被改為dir.c,這顯然不是我們想要的,應(yīng)該修正這個(gè)程序能識(shí)別目錄。
            B,沒(méi)有幫助對(duì)程序的參數(shù)進(jìn)行處理,程序應(yīng)該足夠友好,在用戶沒(méi)有給定后綴名時(shí)應(yīng)能處理,像上面的將直接給文件加上了一個(gè)點(diǎn)(.),這顯然也不是我們想要的。

            因?yàn)槲覀兊哪康氖钦f(shuō)明${var},這樣已經(jīng)足夠了,因此這里不會(huì)再對(duì)上面的程序進(jìn)行修正。

            2.命令替換$(cmd)
            命令替換$(cmd)和符號(hào)`cmd`(注意這不是單引號(hào),在美式鍵盤(pán)上,`是ESC下面的那個(gè)鍵)有相同之處
            PHP 代碼:
            ls
            a b c
            $ echo $(ls)
            a b c
            $ echo `ls`
            a b c 
            我們來(lái)分析一下命令echo $(ls),以便理解所謂命令替換是什么意思:
            shell掃描一遍命令行,發(fā)現(xiàn)了$(cmd)結(jié)構(gòu),便將$(cmd)中的cmd執(zhí)行一次,得到其標(biāo)準(zhǔn)輸出,再將此輸出放到原來(lái)命令echo $(ls)中的$(ls)位置,即替換了$(ls),再執(zhí)行echo命令。
            如下:
            echo $(ls)被替換成了echo a b c
            這里要注意的是$(cmd)中的命令的錯(cuò)誤輸出是不會(huì)被替換的,替換的只是標(biāo)準(zhǔn)輸出:
            PHP 代碼:
            $ var=$(cat d)     ###文件d在當(dāng)前目錄不存在
            catd沒(méi)有那個(gè)文件或目錄
            $ echo $var

            $       ###顯然var變量的值是空的 
            3.一串的命令執(zhí)行()和{}
            ()和{}都是對(duì)一串的命令進(jìn)行執(zhí)行,但有所區(qū)別:
            A,()只是對(duì)一串命令重新開(kāi)一個(gè)子shell進(jìn)行執(zhí)行
            B,{}對(duì)一串命令在當(dāng)前shell執(zhí)行
            C,()和{}都是把一串的命令放在括號(hào)里面,并且命令之間用;號(hào)隔開(kāi)
            D,()最后一個(gè)命令可以不用分號(hào)
            E,{}最后一個(gè)命令要用分號(hào)
            F,{}的第一個(gè)命令和左括號(hào)之間必須要有一個(gè)空格
            G,()里的各命令不必和括號(hào)有空格
            H,()和{}中括號(hào)里面的某個(gè)命令的重定向只影響該命令,但括號(hào)外的重定向則影響到括號(hào)里的所有命令

            我們來(lái)看幾個(gè)例子:
            PHP 代碼:
            $ var=test
            $ (var=notest; echo $var)       ###變量var值為notest,此是在子shell中有效
            notest
            $ echo $var        ###父shell中值仍為test
            test
            $ { var=notest; echo $var;}     ###注意左括號(hào)和var之間要有一個(gè)空格
            notest
            $ echo $var                     ###父shell中的var變量的值變?yōu)榱薾otest
            notest
            $ { var1=test1;var2=test2;echo $var1>a;echo $var2;}    ###輸出test1被重定向到文件a中,
            test2                ###而test2輸出則仍輸出到標(biāo)準(zhǔn)輸出中。
            cat a
            test1
            $ { var1=test1;var2=test2;echo $var1;echo $var2;}>a             ###括號(hào)內(nèi)命令的標(biāo)準(zhǔn)輸出全部被重定向到文件a中
            cat a
            test1
            test2 
            4,幾種特殊的替換結(jié)構(gòu):${var:-string},${var:+string},${var:=string},${var:?string}
            A,${var:-string}和${var:=string}
            若變量var為空,則用在命令行中用string來(lái)替換${var:-string},否則變量var不為空時(shí),則用變量var的值來(lái)替換${var:-string}
            如:
            PHP 代碼:
            $ echo newvar

            $ echo ${newvar:-a}
            a
            $ echo newvar             ###變量newvar的值仍然是空,但上一命令行中${newvar:-a}被替換成了a

            newvar=b
            $ echo ${newvar:-a}       ###變量newvar的值不為空時(shí),此命令行中的${newvar:-b}被替換為$newvar,即b
            b

            對(duì)于${var:=string}的替換規(guī)則和${var:-string}是一樣的,所不同之處是${var:=string}若var為空時(shí),用string替換${var:=string}的同時(shí),把string賦給變量var:

            PHP 代碼:
            $ echo newvar

            $ echo ${newvar:=a}
            a
            $ echo newvar           ###變量newvar被賦值為a,同時(shí)${newvar:=a}被替換成a
            a
            $ echo ${newvar:=b}     ###變量newvar不為空(其值已被賦為a),則${newvar:=b}被替換為newvar的值(即b)
            a
            $ echo $newvar

            ${var:=string}很常用的一種用法是,判斷某個(gè)變量是否賦值,沒(méi)有的話則給它賦上一個(gè)默認(rèn)值。
            如設(shè)置默認(rèn)的編輯器:
            PHP 代碼:
            echo You use editor: ${EDITOR:=/bin/vi
            B,${var:+string}
            ${var:+string}的替換規(guī)則和上面的相反,即只有當(dāng)var不是空的時(shí)候才替換成string,若var為空時(shí)則不替換或者說(shuō)是替換成變量 var的值,即空值。(因?yàn)樽兞縱ar此時(shí)為空,所以這兩種說(shuō)法是等價(jià)的)
            PHP 代碼:
            $ echo $newvar
            a
            $ echo ${newvar:+b}
            b
            $ echo $newvar
            a
            newvar=
            $ echo ${
            newvar:+b}


            C,${var:?string}
            替換規(guī)則為:若變量var不為空,則用變量var的值來(lái)替換${var:?string};若變量var為空,則把string輸出到標(biāo)準(zhǔn)錯(cuò)誤中,并從腳本中退出。我們可利用此特性來(lái)檢查是否設(shè)置了變量的值。
            PHP 代碼:
            newvar=
            $ echo ${
            newvar:?沒(méi)有設(shè)置newvar的值}
            bashnewvar沒(méi)有設(shè)置newvar的值
            newvar=a
            $ echo ${newvar:?沒(méi)有設(shè)置newvar的值}
            a

            補(bǔ)充擴(kuò)展:在上面這五種替換結(jié)構(gòu)中string不一定是常值的,可用另外一個(gè)變量的值或是一種命令的輸出。
            PHP 代碼:
            $ echo ${var:-`date`}
            日 3月 6 02:10:39 CST 2005
            $ echo ${var:-$(date)}
            日 3月 6 02:11:46 CST 2005
            a=test
            $ echo ${var:-$a}
            test

            5.POSIX標(biāo)準(zhǔn)的擴(kuò)展計(jì)算:$((exp))
            這種計(jì)算是符合C語(yǔ)言的運(yùn)算符,也就是說(shuō)只要符合C的運(yùn)算符都可用在$((exp)),甚至是三目運(yùn)算符。
            注意:這種擴(kuò)展計(jì)算是整數(shù)型的計(jì)算,不支持浮點(diǎn)型.若是邏輯判斷,表達(dá)式exp為真則為1,假則為0。
            PHP 代碼:
            $ echo $((3+2))
            5
            $ echo $((3>2))
            1
            $ echo $((25<2:3))
            3
            $ echo $var

            $ echo $((var=2+3))
            5
            $ echo $var
            5
            $ echo $((var++))
            5
            $ echo $var
            6

            好了,上面的例子足夠了,這也表明了這種擴(kuò)展運(yùn)算是很強(qiáng)大的。

            6.四種模式匹配替換結(jié)構(gòu):${var%pattern},${var%%pattern},${var#pattern},${var##pattern}
            這四種結(jié)構(gòu)的意義是:${var%pattern}和${var%%pattern}表示從最右邊(即結(jié)尾)匹配的,${var#pattern}和${var##pattern}從最左邊(即開(kāi)頭)匹配的。其中${var%pattern}和${var#pattern}是最短匹配,${var%%pattern}和${var##pattern}是最長(zhǎng)匹配。只有在pattern中使用了通配符才能有最長(zhǎng)最短的匹配,否則沒(méi)有最長(zhǎng)最短匹配之分。

            結(jié)構(gòu)中的pattern支持通配符,*表示零個(gè)或多個(gè)任意字符,?表示零個(gè)或一個(gè)任意字符,[...]表示匹配中括號(hào)里面的字符,[!...]表示不匹配中括號(hào)里面的字符。
            PHP 代碼:
            $ var=aabbbccbbdbb
            $ echo ${var%b}
            aabbbccbbdb
            $ echo ${var%%b}
            aabbbccbbdb
            $ echo ${var#a}
            abbbccbbdbb
            $ echo ${var##a}
            abbbccbbdbb
            $ echo ${var%*b}
            aabbbccbbdb
            $ echo ${var%%*b}

            $ echo ${var
            #a*}
            abbbccbbdbb
            $ echo ${var##a*}


            上面是簡(jiǎn)單的例舉四種模式匹配替換結(jié)構(gòu)的用法。

            至此,我想講的shell中幾種括號(hào)的結(jié)構(gòu)和變量替換的用法已經(jīng)結(jié)束,有遺漏或錯(cuò)誤的地方請(qǐng)大家指出來(lái),歡迎和我聯(lián)系:huangyiddle@21cn.com。

            久久国产亚洲精品| 狠狠色综合网站久久久久久久高清| 精品久久久无码中文字幕天天| 亚洲va久久久噜噜噜久久| 久久久久人妻精品一区三寸蜜桃| 国产AⅤ精品一区二区三区久久| 色综合合久久天天综合绕视看| 久久成人影院精品777| 国产精品成人99久久久久91gav| 久久人妻少妇嫩草AV无码专区 | 精品国产一区二区三区久久| 综合久久国产九一剧情麻豆| 中文国产成人精品久久亚洲精品AⅤ无码精品| 亚州日韩精品专区久久久| 97久久国产综合精品女不卡| 亚洲精品美女久久久久99小说| 午夜福利91久久福利| 97视频久久久| 亚洲一本综合久久| 香蕉久久夜色精品国产2020| 人人狠狠综合88综合久久| 久久91精品综合国产首页| 久久精品国产99久久久香蕉| 久久国产成人| 久久青青草视频| 亚洲精品无码久久千人斩| 蜜臀久久99精品久久久久久小说 | 久久久国产视频| 欧美国产成人久久精品| 久久无码AV一区二区三区| 久久99毛片免费观看不卡 | 国产91色综合久久免费| 久久这里只精品99re66| 亚洲精品无码专区久久久| 精品一区二区久久久久久久网站| 国产免费福利体检区久久| 午夜精品久久影院蜜桃| 国产午夜福利精品久久2021 | 亚洲午夜久久久久久久久电影网| 亚洲AV无码久久| 国产精品99久久久久久董美香 |