我正在学习Bash脚本。
我的data.txt
包含:
A Orange
B Apple
我试过了
echo "enter"
read fruit
awk -F'[: ]' '$2 == "Apple"' data.txt
a=`awk -F'[: ]' '\$2 == "$fruit"' data.txt` # returns null
echo "$a"
为什么当我使用变量' a'时,我的awk命令无效。用它?
答案 0 :(得分:2)
问题的关键在于您尝试使用单引号字符串,就好像它是双引号字符串一样。
您使用时意味着做什么:
'\$2 == "$fruit"' # DOES NOT WORK - nothing is escaped or expanded
是:
"\$2 == \"$fruit\"" # keep literal $2, expand $fruit
单引号shell字符串中的任何内容都是字面意思,因此不会扩展变量引用,也不需要转义 - 也不能转义( \
也将成为字符串的文字部分。)
尽管如此,最好将shell和Awk脚本的世界分开,以防止混淆,这意味着:
-v
选项将任何shell变量值传递给脚本,以创建 Awk 变量。如果我们把它们放在一起:
a=$(awk -F'[: ]' -v fruit="$fruit" '$2 == fruit' data.txt)
请注意,我使用了现代命令替换语法$(...)
,即preferable to legacy syntax `...`
。