$@ bash 参数未转义

$@ bash arguments are not escaped

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

foo () { echo $@; }

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

$ foo -a bar
-a bar

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

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

我预计:

-l bar -m "asd asd"

我该怎么做?

我尝试将 $@ 放在引号之间:"$@",我还尝试传递 $* 变量,其中 none 符合我的期望。

您对 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 等工具天真地显示参数显示 "incorrect" 结果。

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

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

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