如果$ 1是/ *,如何在不发出匹配glob的文件的情况下回显$ 1?

时间:2015-03-30 21:57:05

标签: bash sed

我有4个参数添加到excetute文件:

./project01.sh /*  */  /^  ^/

我希望将每个参数作为变量 但在此之前我想修改它,因为它将不方便进一步操作。所以我想把它变成" / *"所以把它放进""并且在每个角色给出\之前,因为其中一些是特殊字符。 我试过这样用:

beg1=echo $1 | sed(some change with $1)

但它立即改变$ 1,这是/ *到direction / bin / boot itd。在那种情况下我该怎么办?

1 个答案:

答案 0 :(得分:1)

首先,在调用脚本时,您无法做任何事情来避免引用。您必须将其称为:

./project01.sh '/*' '*/' '/^' '^/'

...如果你想防止任何shell操作的可能性。 (^对一些炮弹是安全的,但不是全部。)

这是因为在./project01.sh /*(没有引号)的情况下,扩展在脚本启动之前发生 ,因此一旦您的脚本运行,进行更改就太晚了。


其次,在脚本中使用更多引号:

echo "$1" | sed ...

...或更好(修复$1包含-E-n或类似值的情况):

printf '%s\n' "$1" | sed ...

......或者,更好的是,如果你的shell是bash而不是/bin/sh ...

sed ... <<<"$1"

但是,如果您使用sed的目的是为您的参数添加语法引用,那么这将永远不会起作用:在脚本运行之前,参数已经展开,因此$1已经 /bin