为什么在使用echo命令时反斜杠会消失?

8

我有这样的代码,用于处理CSV文件:

#!/bin/bash
while read line
do
    variable=$(echo $line | awk -F, '{print $2}')
    echo $variable
 done < ./file.csv

如果CSV文件中包含任何\,当我运行此命令时,输出文本不会显示\
如何确保\不被删除?

尝试使用双引号:"$(echo "$line" | awk -F, '{print $2}')". - C2H5OH
那是一个反斜杠。从底部开始。 - Matthew Flaschen
3个回答

19
这种行为的原因是因为内置的read命令使用\作为转义字符。通过使用-r参数可以禁用这种行为。
所以,下面的命令应该可以正常工作:
while read -r line
  variable=$(echo $line | awk -F, '{print $2}')
  echo $variable
done < ./file.csv

你还应该像这样在 $(...) 和变量周围放置 "..."

variable="$(command)"
echo "$variable"

2
此外,可以使用 cut -d,-f2 替代那个 awk 命令。 - Zash
你的read -r建议对于我相反的问题,即如何在while循环中删除\也适用,所以谢谢! - Chris Marie

1

bash 的 man 手册对 read 命令有如下说明:

反斜杠字符 (\) 可以用于取消下一个字符的特殊含义,以及进行行续航。


1
发现一个好的参考 这里

在 shell 中,\(反斜杠)是引号字符。这意味着,除非 \ 与转义字符一起使用或用引号括起来,例如 "" 或 '',否则当命令被扩展时,shell 会删除反斜杠。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接