簡體   English   中英

在Bash中為變量分配“ $ @”並保留轉義

[英]Assigning “$@” to a variable in Bash and preserving escaping

如果我將以下腳本另存為'args.bash'並運行bash args.bash -a 'foo bar'

#!/bin/bash

main() {
    set -x
    which "$@"

    local args="$@"
    which "$args"
    which $args

    local args=$(printf " %q" "$@")
    which "$args"
    which $args
}
main "$@"

我很驚訝地看到這些打印出不同的結果。 第一個打印:

which -a 'foo bar'

我期望的! 它將參數正確分組。

其余的按順序打印:

which '-a foo bar'
which -a foo bar
which ' -a foo\ bar'
which -a 'foo\' bar

在某種程度上都是不正確的。 如何為變量分配"$@" ,並使其回顯與第一個命令相同的輸出?

使用數組變量,而不是標量:

items=( "$@" )
which -a "${items[@]}"

但是,如果必須使用標量[1] ,則可以正確地使用printf '%q ' ; 但是請注意, printf %q創建了一個字符串,該字符串將在通過完整解析器運行時對其求值(因此需要eval或等效項才能確保調用完整解析器):

printf -v items_str '%q ' "$@"
eval "which -a $items_str"

[1]具有bash擴展名(例如printf -v%q但不能使用數組的情況數量有限,但它們確實存在; 特別是想到通過環境將值傳遞給子流程。 但是,在大多數情況下,數組不合適,我希望使用一系列不同的環境變量(每個值一個),或者傳遞NUL分隔的流(由printf '%s\\n' "$@" )更合適,即使(對於環境而言)可能需要轉義(例如,通過base64-encoding)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM