簡體   English   中英

用sed修改bash變量

[英]Modify bash variables with sed

我正在嘗試修改許多包含預定義編譯器標志的環境變量。 為此,我嘗試使用bash循環,該循環遍歷用“ env”列出的所有環境變量。

for i in $(env | grep ipo | awk 'BEGIN {FS="="} ; { print $1 } ' ) 

 do echo $(sed -e "s/-ipo/ / ; s/-axAVX/ /" <<< $i)  

done

這是行不通的,因為循環變量$ i僅包含存儲為字符串的環境變量的名稱。 我嘗試搜索一種將字符串轉換為變量的方法,但是事情開始變得不必要的復雜。 基本問題是如何正確提供環境變量本身給sed。

歡迎提供任何有關如何正確修改腳本的想法。

謝謝,亞歷克斯

第一部分

您解析env錯誤的 只要您有空格或通配符,它​​就會中斷。 而是使用此:

while IFS= read -r line; do
    # do stuff with variable line
done < <(env)

要查看為什么您的解決方案被破壞,請執行以下操作:

for i in $(env); do
    echo "$i"
done

並且您很可能會看到env的輸出有所不同。

現在, while變量中包含換行符時,我給出的while方法也會中斷。

您的env版本很可能帶有標志-0--null 使用它是100%安全的:

while IFS= read -r -d '' line; do
    # do stuff with variable line
done < <(env --null)

第二部分

讀完行后,您想將其拆分為鍵和值。 不要使用awk。 使用重擊:

key=${line%%=*}
value=${line#*=}

看:

while IFS= read -r -d '' line; do
    key=${line%%=*}
    value=${line#*=}
    echo "key: $key"
    echo "value: $value"
done < <(env --null)

第三部分

現在,我了解到您只想對包含字符串ipo的變量執行操作,對於這些變量,您想要用空格替換字符串-ipo-axAVX 所以:

while IFS= read -r -d '' line; do
    key=${line%%=*}
    value=${line#*=}
    [[ $value = *ipo* ]] || continue
    value=${value/-ipo/ }
    value=${value/-axAVX/ }
    echo "key: $key"
    echo "new value: $value"
done < <(env --null)

第四部分

您要用此新值替換變量。 您可以為此使用declare (您不需要內置的export ,因為您的變量已被標記為已導出):

while IFS= read -r -d '' line; do
    key=${line%%=*}
    value=${line#*=}
    [[ $value = *ipo* ]] || continue
    value=${value/-ipo/ }
    value=${value/-axAVX/ }
    declare "$key=$value"
done < <(env --null)

第五部分

最后,您將嘗試將其放入腳本中,並且您會意識到它不起作用:這是因為腳本是在子進程中執行的,並且父進程看不到子進程中進行的所有更改。 所以,你要采購吧! 要獲取文件file ,請使用:

. file

(是,點,空格和文件名)。

嘗試間接擴展

for i in $(env | grep ipo | awk 'BEGIN {FS="="} ; { print $1 } ' ) 
do
    echo $(sed -e "s/-ipo/ / ; s/-axAVX/ /" <<< ${!i})  
done

我認為您缺少的是${!i}來擴展名為$i設置為的變量。

#!/bin/sh
for i in $(env | grep ipo | awk 'BEGIN {FS="="} ; { print $1 }' )
do
 val=$(sed -e "s/-ipo/ / ; s/-axAVX/ /" <<< ${!i})
 export ${i}=${val}
 echo ${i} is now set to $val
done

... do stuff with new env variables

如果運行腳本,它將更改自身及其產生的任何環境變量。 但是,當返回時,您仍將具有與開始時相同的環境。

$ echo $IPOVAR
blah -ipo -axAVX end   # variable stats as this

$ sh env.sh
IPOVAR is now set to blah end  # It is changed!

$ echo $IPOVAR
blah -ipo -axAVX end   # Its still the same.

我相信您可以在awk中完成所有操作:

env | grep ipo | awk -F= '{ gsub("-ipo","",$2); gsub("-axAVX","",$2); print $0}'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM