相关疑难解决方法(0)

如何在Bash中转义任意字符串以用作命令行参数?

我有一个字符串列表,我想在单个Bash命令行调用中将这些字符串作为参数传递.对于简单的字母数字字符串,只需逐字传递即可:

> script.pl foo bar baz yes no
foo
bar
baz
yes
no
Run Code Online (Sandbox Code Playgroud)

我理解如果一个参数包含空格或反斜杠或双引号,我需要反斜杠 - 转义双引号和反斜杠,然后双引号参数.

> script.pl foo bar baz "\"yes\"\\\"no\""
foo
bar
baz
"yes"\"no"
Run Code Online (Sandbox Code Playgroud)

但是当参数包含感叹号时,会发生以下情况:

> script.pl !foo
-bash: !foo: event not found
Run Code Online (Sandbox Code Playgroud)

双引号不起作用:

> script.pl "!foo"
-bash: !foo: event not found
Run Code Online (Sandbox Code Playgroud)

反斜杠也不会逃避(注意输出中的字面反斜杠如何):

> script.pl "\!foo"
\!foo
Run Code Online (Sandbox Code Playgroud)

我对Bash了解不多,但我知道还有其他特殊字符可以做类似的事情.在Bash中安全地转义任意字符串以用作命令行参数的一般过程是什么?假设字符串可以是任意长度并包含特殊字符的任意组合.我想要一个escape()子程序,我可以使用如下(Perl示例):

$cmd = join " ", map { escape($_); } @args;
Run Code Online (Sandbox Code Playgroud)

下面是一些应该通过此函数安全转义的示例字符串(我知道其中一些看起来像Windows,这是故意的):

yes
no
Hello, world      [string with a comma and space in it]
C:\Program Files\ [path …
Run Code Online (Sandbox Code Playgroud)

bash perl

31
推荐指数
3
解决办法
2万
查看次数

标签 统计

bash ×1

perl ×1