Skip to content


bash

单引号(‘)双引号(“) 反斜杠()

$(command) command 命令替換(command substitution),推荐用$() ${}

meta

  • IFS:由 或 或 三者之一組成(我們常用 space )。
  • CR:由 產生。 IFS 是用來拆解 command line 的每一個詞(word)用的,因為 shell command line 是按詞來處理的。 而 CR 則是用來結束 command line 用的,這也是為何我們敲 命令就會跑的原因。 除了 IFS 與 CR ,常用的 meta 還有: = : 設定變量。 $ : 作變量或運算替換(請不要與 shell prompt 搞混了)。 > :重導向 stdout。 < :重導向 stdin。 |:命令管線。 & :重導向 file descriptor ,或將命令置於背境執行。 ( ):將其內的命令置於 nested subshell 執行,或用於運算或命令替換。 { }:將其內的命令置於 non-named function 中執行,或用在變量替換的界定範圍。 ; :在前一個命令結束時,而忽略其返回值,繼續執行下一個命令。 && :在前一個命令結束時,若返回值為 true,繼續執行下一個命令。 || :在前一個命令結束時,若返回值為 false,繼續執行下一個命令。 !:執行 history 列表中的命令 ....

$ A=ls $ B=la $ C=/tmp $ $A -$B $C

export variable

showvar() { var=${str=expr} echo \$var is $var echo \$str is $str } 变量null,unset,not null的差别

=和:=的差别

fork source exec 的差别

( ) 將 command group 置於 sub-shell 去執行,也稱 nested sub-shell。 { } 則是在同一個 shell 內完成,也稱為 non-named command group。 所謂的 function ,就是用一個名字去命名一個 command group ,然後再調用這個名字去執行 command group 。 從 non-named command group 來推斷,大概你也可以猜到我要說的是 { } 了吧 在 bash 中,function 的定義方式有兩種: 方式一:

function function_name { command1 command2 command3 …. }

方式二:

fuction_name () { command1 command2 command3 …. }

${ } 的一些特異功能: 假設我們定義了一個變量為: 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 記憶的方法為: [list]# 是去掉左邊(在鑑盤上 # 在 $ 之左邊) % 是去掉右邊(在鑑盤上 % 在 $ 之右邊) 單一符號是最小匹配﹔兩個符號是最大匹配。[/list] ${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 的組數替換方法可參考如下方法: ${A[@]} 或 ${A[]} 可得到 a b c def (全部組數) ${A[0]} 可得到 a (第一個組數),${A[1]} 則為第二個組數… ${#A[@]} 或 ${#A[]} 可得到 4 (全部組數數量) ${#A[0]} 可得到 1 (即第一個組數(a)的長度),${#A[3]} 可得到 3 (第四個組數(def)的長度) A[3]=xyz 則是將第四個組數重新定義為 xyz …

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

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

好了,最後為大家介紹 $(( )) 的用途吧:它是用來作整數運算的。 在 bash 中,$(( )) 的整數運算符號大致有這些:

      • / :分別為 “加、減、乘、除”。 % :餘數運算 & | ^ !:分別為 “AND、OR、XOR、NOT” 運算。

例: [code]$ a=5; b=7; c=2 $ echo $(( a+bc )) 19 $ echo $(( (a+b)/c )) 6 $ echo $(( (ab)%c)) 1[/code]

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

此外,$(( )) 還可作不同進位(如二進位、八進位、十六進位)作運算呢,只是,輸出結果皆為十進位而已: echo $((16#2a)) 結果為 42 (16進位轉十進位) 以一個實用的例子來看看吧: 假如當前的 umask 是 022 ,那麼新建文件的權限即為: [code]$ umask 022 $ echo “obase=8;$(( 8#666 & (8#777 ^ 8#$(umask)) ))” | bc 644[/code]

事實上,單純用 (( )) 也可重定義變量值,或作 testing: a=5; ((a++)) 可將 $a 重定義為 6 a=5; ((a–)) 則為 a=4 a=5; b=7; ((a < b)) 會得到 0 (true) 的返回值。 常見的用於 (( )) 的測試符號有如下這些: [list]<:小於 >:大於 <=:小於或等於 >=:大於或等於 ==:等於 !=:不等於[/list] 不過,使用 (( )) 作整數測試時,請不要跟 [ ] 的整數測試搞混亂了

Posted in shell, 技术.

Tagged with .


No Responses (yet)

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.



Some HTML is OK

or, reply to this post via trackback.