dash: 如何在 zsh 中引用参数 ala "${(q+@)@}" ?

dash: 如何在 zsh 中引用参数 ala "${(q+@)@}" ?

我想引用 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//\'/\'\\\'\'}

其优点是保留尾随换行符。尽管在bashshell 中,您也可以这样做

reval () {
    eval "${@@Q}"
}

...其中${variable@Q}引用该值$variable,以便它适合 shell 输入。对于variablebeing @,这适用于所有位置参数。

${(q)@}这与您在shell 中得到的类似zsh

reval () {
    eval "${(q)@}"
}

相关内容