簡體   English   中英

Shell Bash腳本

[英]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中會將光標移到開頭

注意事項:

  1. 要記住的另一個微妙點是避免對用戶腳本使用大寫的變量名,例如VAR1 所以用var1代替
  2. 將值分配給變量空間時,不允許在=周圍使用,因此

     VAR1="Note there are no spaces around = sign" 

    是正確的用法

暫無
暫無

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

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