[英]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.