在bash脚本

时间:2018-04-10 10:35:53

标签: bash sed glob

注意:这个问题的目标是在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

现在一切正常。

1 个答案:

答案 0 :(得分:0)

您可以使用type检查命令是否会评估。

$ placeholder1="testing"
$ placeholder2="test"

$ type $placeholder1
-bash: type: testing: not found

$ type $placeholder2
test is a shell builtin