$@ 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"
我想在 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"