存储到变量vs输出到stdout时,为什么相同的命令不同?

时间:2014-01-19 03:28:40

标签: bash text sed

我正在使用以下输出:

OUTPUT="VAL1  VAL2  VAL3  VAL4" #(two spaces between each VAL)

我正在尝试将输出存储在变量SAMPLE中,以便将双空格替换为逗号,就像在脚本中运行一样:

SAMPLE=$(echo $OUTPUT | sed 's/\ \ /\,/g'); echo $SAMPLE

返回VAL1 VAL2 VAL3 VAL4(每个val之间有一个空格)

然而,如果我在不将其存储到变量的情况下运行它,我会获得不同的输出

echo $OUTPUT | sed 's/\ \ /\,/g')根据需要返回VAL1,VAL2,VAL3,VAL4

1 个答案:

答案 0 :(得分:3)

作为一项规则,您应该始终在bash中引用变量以保留格式(除非您有一些不使用引号的特定原因,例如想要扩展,想要做一些像使用echo $variable限制到一个空间的hackish,在[[]]内(可选)等......)

$ echo $OUTPUT 
VAL1 VAL2 VAL3 VAL4" 
$ echo "$OUTPUT" 
VAL1  VAL2  VAL3  VAL4

$ SAMPLE=$(echo "$OUTPUT" | sed 's/\ \ /\,/g'); echo "$SAMPLE"
VAL1,VAL2,VAL3,VAL4

echo $OUTPUT | sed 's/\ \ /\,/g'不应该导致逗号分隔列表(不引用$OUTPUT),除非您有一些奇怪的echo / shell

此外,在bash中使用大写变量名称可能不是最好的惯例,因为它们主要用于内部变量(例如$PWD