我想在bash函数中保留引号的转义:
foo () { echo $@; }
上面的函数将打印传递给它的参数:
$ foo -a bar
-a bar
这很好,但是当我传递引号时,我想将它们保存在一个参数中:
$ foo -l 'bar' -m "asd asd"
-l bar -m asd asd
我期待:
-l bar -m "asd asd"
我该怎么做?
我尝试将$@
放在引号之间:"$@"
,我也尝试传递$*
变量,但没有一个符合我的预期。
答案 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
等天真地显示参数的工具显示"不正确"结果