Bash 不要替换 $

Bash don't replace $

我想编写一个 bash 脚本来创建其他 bash 脚本。但是当我这样做时

echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/SOME/PATH" >> NEWFILE.sh

它已经取代了第一个脚本中的 $LD_LIBRARY_PATH。 所以在 NEWFILE.sh 我只得到:

export LD_LIBRARY_PATH=:~/SOME/PATH

但我希望在 NEWFILE.sh 中还有:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/SOME/PATH

所以当 运行 NEWFILE.sh 时它会被替换。我希望这是有道理的。感谢您的帮助

你应该转义 $ 如下:

echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/SOME/PATH" >> NEWFILE.sh

如果您不想插入变量,请使用单引号:

echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/SOME/PATH' >> NEWFILE.sh

但即使是这个小片段也有问题。当 NEWFILE.sh 以空 LD_LIBRARY_PATH 运行时,它将创建一个具有前导 : 的无效值。此外,在变量中使用 ~ 也是不好的做法。相反,您应该这样做:

echo 'export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}${LD_LIBRARY_PATH:+:}$HOME/SOME/PATH' >> NEWFILE.sh

此外,此代码段使 NEWFILE.sh 不是幂等的,您可能会在最终值中得到 $HOME/SOME/PATH 的多个实例。这很容易避免,但需要更多的逻辑。类似于:

cat << \EOF >> NEWFILE.sh
pathmunge () { case ":${LD_LIBRARY_PATH}:" in *:"":*) ;;
*) LD_LIBRARY_PATH="$LD_LIBRARY_PATH${LD_LIBRARY_PATH:+:}";; esac; }
pathmunge $HOME/SOME/PATH
export LD_LIBRARY_PATH
EOF

这使用引用 HEREDOC 的常用技术(EOF 之前的反斜杠是必不可少的;当您删除前导反斜杠时,看看它是如何变化的)来防止插值,并允许多行输出和引号用于将要写入 NEWFILE.sh.

的内容

一个小问题是,这最终会将 $HOME 的扩展放在 LD_LIBRARY_PATH 中,这可能是您想要的。如果你真的想在路径中使用 $HOME(以便在使用 LD_LIBRARY_PATH 时扩展它,而不是在定义它时),你可以做 pathmunge '$HOME/path',但你可能会结束在最终值中有重复的实例,因为 pathmunge 不会将未展开的值识别为与展开的值匹配。避免重复是留给 reader.

的练习。

请注意,根据 NEWFILE.sh 的剩余内容,您可能希望确保 pathmunge 仅定义一次,并且该定义不会覆盖其他定义。 pathmunge 是用于修改 PATH 的函数的通用名称,因此您可能需要考虑一个不同的名称,或者添加逻辑以允许它采用要覆盖的变量的名称。