grep awk sed 正則表達式,只把匹配的內容(不是整個匹配行)提取出來,保存到 shell 腳本變量


問題 1

描述

bash 腳本中,需要把參數 -J -I 1 -M1 -a1 -x1 中的 -I x 參數提取出來,保存備用。

確定正則表達式

-I 后面可以有一個空格,也可以沒有,空格之后只能是 01,正則表達式很容易寫出來 -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) 函數中 exportGLOBAL_VAR 也不可以。因為環境變量也是只能在當前 shell 和子 shell 中生效,父 shell 還是無法獲取到 export 的變量。

原文鏈接:https://www.cnblogs.com/tengzijian/p/15042797.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM