[英]Shell Bash Script
我正在制作bash腳本。 我必須得到3個變量
VAR1=$(cat /path to my file/ | grep "string1" | awk '{ print $2 }'
VAR2=$(cat /path to my file/ | grep "string2" | awk '{ print $2 }'
VAR3=$(cat /path to my file/ | grep "string3" | awk '{ print $4 }'
我的問題是,如果我寫
echo $VAR1
echo $VAR2
echo $VAR3
我可以正確看到值
但是當我嘗試將它們寫成這樣的一行時
echo "VAR1: $VAR1 VAR2: $VAR2 VAR3: $VAR3"
$VAR3
值寫在輸出覆蓋$VAR1
和$VAR2
的開頭
我希望我的解釋很清楚。 如有任何疑問,請通知我
謝謝並恭祝安康。
朗伯特
在我看來$VAR3
包含\\r
,在某些shell中會將光標移動到該行的開頭。 使用printf
代替:
printf "VAR1: %s VAR2: %s VAR3: %s\n" "$VAR1" "$VAR2" "$VAR3"
還要注意,提取值的方式效率很低,可以簡化為一次調用awk
:
read -r var1 var2 var3 _ < <(awk '/string1/ { a=$2 }
/string2/ { b=$2 }
/string3/ { c=$4 }
END { print(a, b, c) }' /path/to/file)
printf "VAR1: %s VAR2: %s VAR3: %s\n" "$var1" "$var2" "$var3"
nitpick是大寫變量名稱保留給環境變量使用,因此我全部更改為小寫。
<(...)
是一個進程替換,它將使...
寫入“文件”並返回文件名:
$ echo <(ls)
/dev/fd/63
command < file
是從文件file
來的command
重定向改變標准輸入。
你可以這樣寫:
cat /path to my file/ | grep "string1" | awk '{ print $2 }'
如
awk '/string1/{print $2}' /path/to/file
換句話說,您可以單獨使用awk
來完成對cat, grep & awk
所以最后得到:
VAR1=$(awk '/string1/{print $2}' /path/to/file) #mind the closing ')'
關於您遇到的問題,看起來您的變量中有回車符或\\r
。 在bash中, echo
不會在沒有-e
選項的情況下解釋轉義序列,但在printf
選項中
[@andlrc]指出這是不錯的嘗試,正如他在[答案]中提到的那樣。
在某些shell中會將光標移到開頭
注意事項:
VAR1
。 所以用var1
代替 將值分配給變量空間時,不允許在=
周圍使用,因此
VAR1="Note there are no spaces around = sign"
是正確的用法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.