$ @bash参数不会被转义

时间:2015-01-25 18:36:43

标签: bash shell

我想在bash函数中保留引号的转义:

foo () { echo $@; }

上面的函数将打印传递给它的参数:

$ foo -a bar
-a bar

这很好,但是当我传递引号时,我想将它们保存在一个参数中:

$ foo -l 'bar' -m "asd asd" 
-l bar -m asd asd

我期待:

-l bar -m "asd asd"

我该怎么做?

我尝试将$@放在引号之间:"$@",我也尝试传递$*变量,但没有一个符合我的预期。

2 个答案:

答案 0 :(得分:2)

我认为你想要实现的目标是不可能的。在函数foo中,无法查看传递的参数是否已被引用。该函数只能看到参数数组。

你能接受引用的所有论据吗?在构造新命令时,可以使用不需要的双引号。

$ foo () { declare arg; for arg in "$@"; do echo -n ' "'$arg'"' ; done; echo; }
$ foo -l 'bar' -m "asd asd" 
 "-l" "bar" "-m" "asd asd"

答案 1 :(得分:1)

您对bash中的参数如何运作缺乏了解。

foo()的输出是正确的,但您的实现不是。将多个单词视为单个参数不需要引号;我们需要的是告诉bash使用并正确传递参数。观察:

$ foo () { bar $@; }
$ bar () { echo $@; echo $#; }
$ foo -l 'bar' -m "asd asd" 
-l bar -m asd asd
5
$ foo () { bar "$@"; }
$ foo -l 'bar' -m "asd asd" 
-l bar -m asd asd
4
$ bar () { echo "$@"; echo $#; }
$ foo -l 'bar' -m "asd asd" 
-l bar -m asd asd
4

引用$@(作为"$@")指示bash不对传递给脚本或函数的参数执行分词,尽管echo等天真地显示参数的工具显示"不正确"结果