注意:这个问题的目标是在bash脚本中找到合适的字符序列以进行有效的占位符替换,而不是查找命令是否被评估。
我有一个名为my_script.skel
的bash脚本的骨架,我必须在其中放置一个占位符。我想找一个可以安全替换的占位符序列(我的意思是没有与其他bash命令或其他病态替换的任何冲突,请参阅 A一个例子的非安全示例。
我自己想出placeholder_name
#~
内的~#
和/placeholder_name/
似乎是一个很好的解决方案,但我不确定这种解决方案在每种情况下都是安全的
可以决定使用my_dumb_script.skel
。所以#!/bin/bash
AN_INNOCENT_PATH="/a/simple/placeholder_name/path"
echo /placeholder_name/
是:
/placeholder_name/
目标是在echo
命令中替换仅 sed 's%/placeholder_name/%foobar%g' my_dumb_script.skel > output.bash
。如果现在我在占位符上使用sed:
#!/bin/bash
AN_INNOCENT_PATH="/a/simplefoobarpath"
echo foobar
输出可能是意外的:
AN_INNOCENT_PATH
在这种情况下,我们在/
内获得了不需要的替换,因为在包含placeholder_name
字符的占位符上很容易进行模式匹配。我知道这看起来很愚蠢,但你不知道将来人们将如何使用你的代码(有人可以创建一个名为my_better_script.skel
的文件夹。)
在这种情况下,#!/bin/bash
AN_INNOCENT_PATH="/a/simple/placeholder_name/path"
echo #~placeholder_name~#
是以下一个:
sed
现在我们可以使用sed 's%#~placeholder_name~#%foobar%g' my_better_script.skel > output.bash
:
#!/bin/bash
AN_INNOCENT_PATH="/a/simple/placeholder_name/path"
echo foobar
现在输出更好:
implode
现在一切正常。
答案 0 :(得分:0)
您可以使用type
检查命令是否会评估。
$ placeholder1="testing"
$ placeholder2="test"
$ type $placeholder1
-bash: type: testing: not found
$ type $placeholder2
test is a shell builtin