我想引用 dash 中的参数(或者 sh,如果不可能的话甚至是 bash)。我可以使用"${(q+@)@}"
zsh 来做到这一点,这与在终端中reval <sth> ...
输入相同:<sth> ...
reval () {
eval "$(gquote "$@")"
}
gquote () {
print -r -- "${(q+@)@}"
}
答案1
for arg do
arg=$(printf '%s\n' "$arg" | sed "s/'/'\\\''/g")
set -- "$@" "'$arg'"
shift
done
eval "$@"
这会在每个位置参数周围添加单引号。该循环迭代每个位置参数,将当前位置参数添加到列表末尾并添加单引号,然后删除第一个(现已处理)元素。
在添加'$arg'
到列表末尾之前,嵌入的任何单引号都会使用$arg
替换为字符串。'\''
sed
作为一个名为的函数reval
:
reval () {
for arg do
arg=$(printf '%s\n' "$arg" | sed "s/'/'\\\''/g")
set -- "$@" "'$arg'"
shift
done
eval "$@"
}
(参数将由此删除尾随换行符。)
在shell 中,您可以将循环中的bash
命令替换调用printf
和替换为sed
arg=${arg//\'/\'\\\'\'}
其优点是保留尾随换行符。尽管在bash
shell 中,您也可以这样做
reval () {
eval "${@@Q}"
}
...其中${variable@Q}
引用该值$variable
,以便它适合 shell 输入。对于variable
being @
,这适用于所有位置参数。
${(q)@}
这与您在shell 中得到的类似zsh
:
reval () {
eval "${(q)@}"
}