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 的函数的通用名称,因此您可能需要考虑一个不同的名称,或者添加逻辑以允许它采用要覆盖的变量的名称。
我想编写一个 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 的函数的通用名称,因此您可能需要考虑一个不同的名称,或者添加逻辑以允许它采用要覆盖的变量的名称。