問題 1
描述
bash 腳本中,需要把參數 -J -I 1 -M1 -a1 -x1 中的 -I x 參數提取出來,保存備用。
確定正則表達式
-I 后面可以有一個空格,也可以沒有,空格之后只能是 0 或 1,正則表達式很容易寫出來 -I ?[01]
僅提取匹配內容,而非整行
可以通過 grep 的 -o 參數實現
測試
echo "-J -I0 -M1 -a1 -x1" | grep -oE '\-I ?[01]' # 輸出 -I0
echo "-J -I 1 -M1 -a1 -x1" | grep -oE '\-I ?[01]' # 輸出 -I 1
echo "-J -I 2 -M1 -a1 -x1" | grep -oE '\-I ?[01]' # 輸出為空
echo "-J -M1 -a1 -x1" | grep -oE '\-I ?[01]' # 輸出為空
問題 2
描述
解決了正則匹配的問題,新的問題又來了。
腳本內的函數調用有兩種方法:通過函數名 foo 直接調用,或者通過 $(foo) 調用。
注意:加不加 $() 有如下差別:
#!/bin/bash
GLOBAL_VAR="Initial Value"
function foo()
{
GLOBAL_VAR=$(echo "-J -I 1 -M1 -a1 -x1" | grep -oE '\-I ?[01]')
echo "Hello World"
}
$(foo) # 新建子 shell 執行函數,在子 shell 中改變 GLOBAL_VAR 不影響父 shell 的變量,foo 輸出(echo)的內容 Hello World 作為新的命令執行(會提示找不到 Hello 命令!)
echo $GLOBAL_VAR # 輸出"Initial Value"
foo # 在當前 shell 中執行函數,改變 GLOBAL_VAR
echo $GLOBAL_VAR # 輸出"-I 1"
var1=$(foo) # 調用函數 foo,foo 的輸出(echo)保存到變量 var1 中,var1 內容為 "Hello World"
var2=foo # var2 內容為 "foo"
var3=${foo} # 把變量 foo 的內容(因為沒有定義 foo 變量,foo 變量的內容自然為空)保存到 var3 變量
echo "var1: $var1" # 輸出 var1: Hello World
echo "var2: $var2" # 輸出 var2: foo
echo "var3: $var3" # 輸出 var3:
注意:即使在 $(foo) 函數中 export 了 GLOBAL_VAR 也不可以。因為環境變量也是只能在當前 shell 和子 shell 中生效,父 shell 還是無法獲取到 export 的變量。
