zoukankan      html  css  js  c++  java
  • shell十三问:关于${0##*/} 和${0%/*}

    转自shell十三问:  http://bbs.chinaunix.net/thread-218853-1-1.html

    ……

    假設我們定義了一個變量為:
    file=/dir1/dir2/dir3/my.file.txt
    我們可以用 ${ } 分別替換獲得不同的值:
    ${file#*/}:拿掉第一條 / 及其左邊的字串:dir1/dir2/dir3/my.file.txt
    ${file##*/}:拿掉最後一條 / 及其左邊的字串:my.file.txt
    ${file#*.}:拿掉第一個 .  及其左邊的字串:file.txt
    ${file##*.}:拿掉最後一個 .  及其左邊的字串:txt
    ${file%/*}:拿掉最後條 / 及其右邊的字串:/dir1/dir2/dir3
    ${file%%/*}:拿掉第一條 / 及其右邊的字串:(空值)
    ${file%.*}:拿掉最後一個 .  及其右邊的字串:/dir1/dir2/dir3/my.file
    ${file%%.*}:拿掉第一個 .  及其右邊的字串:/dir1/dir2/dir3/my
    記憶的方法為:

        # 是去掉左邊(在鑑盤上 # 在 $ 之左邊)
        % 是去掉右邊(在鑑盤上 % 在 $ 之右邊)
      單一符號是最小匹配﹔兩個符號是最大匹配。


    ${file:0:5}:提取最左邊的 5 個字節:/dir1
    ${file:5:5}:提取第 5 個字節右邊的連續 5 個字節:/dir2

    我們也可以對變量值裡的字串作替換:
    ${file/dir/path}:將第一個 dir 提換為 path:/path1/dir2/dir3/my.file.txt
    ${file//dir/path}:將全部 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} :若 $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} :若 $file 沒設定或為空值,則將 my.file.txt 輸出至 STDERR。 (非空值時不作處理)

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


    還有哦,${#var} 可計算出變量值的長度:
    ${#file} 可得到 27 ,因為 /dir1/dir2/dir3/my.file.txt 剛好是 27 個字節...

    接下來,再為大家介稍一下 bash 的組數(array)處理方法。
    一般而言,A="a b c def" 這樣的變量只是將 $A 替換為一個單一的字串,
    但是改為 A=(a b c def) ,則是將 $A 定義為組數...
    bash 的組數替換方法可參考如下方法:

    1. ${A[@]} 或 ${A[*]}
    复制代码

    可得到 a b c def (全部組數)

    1. ${A[0]}
    复制代码

    可得到 a (第一個組數),${A[1]} 則為第二個組數...

    1. ${#A[@]} 或 ${#A[*]}  
    复制代码

    可得到 4 (全部組數數量)

    1. ${#A[0]}
    复制代码

    可得到 1 (即第一個組數(a)的長度),${#A[3]} 可得到 3 (第四個組數(def)的長度)

    1. A[3]=xyz  
    复制代码

    則是將第四個組數重新定義為 xyz ...

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

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

    例:

    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
    复制代码



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

    此外,$(( )) 還可作不同進位(如二進位、八進位、十六進位)作運算呢,只是,輸出結果皆為十進位而已:
    echo $((16#2a)) 結果為 42 (16進位轉十進位)
    以一個實用的例子來看看吧:
    假如當前的  umask 是 022 ,那麼新建文件的權限即為:

    1. $ umask 022
    2. $ echo "obase=8;$(( 8#666 & (8#777 ^ 8#$(umask)) ))" | bc
    3. 644
    复制代码



    事實上,單純用 (( )) 也可重定義變量值,或作 testing:
    a=5; ((a++)) 可將 $a 重定義為 6 
    a=5; ((a--)) 則為 a=4
    a=5; b=7; ((a < b)) 會得到  0 (true) 的返回值。
    常見的用於 (( )) 的測試符號有如下這些:

        <:小於
        >:大於
        <=:小於或等於
        >=:大於或等於
        ==:等於
      !=:不等於


    不過,使用 (( )) 作整數測試時,請不要跟 [ ] 的整數測試搞混亂了。(更多的測試我將於第十章為大家介紹)

    怎樣?好玩吧..  ^_^  okay,這次暫時說這麼多...
    上面的介紹,並沒有詳列每一種可用的狀態,更多的,就請讀者參考手冊文件囉...

  • 相关阅读:
    字符串匹配算法之Rabin-Karp算法
    算法导论之最近顶点对
    php连mssql中文乱码问题
    Trie树
    PAT 1057. Stack (30)
    PAT 1033. To Fill or Not to Fill (25)
    PAT 1034. Head of a Gang (30)
    PAT 1075. PAT Judge (25)
    spring框架资料
    Spring Security资料
  • 原文地址:https://www.cnblogs.com/ph829/p/4801300.html
Copyright © 2011-2022 走看看