2017-01-12 22 views
3

AFAICT、一重引用符内のものは展開しないでください。 Bashマニュアルによると、配列内の一重引用拡張

一重引用符で囲まれた文字は、引用符内の各文字が のリテラル値を保持します。一重引用符は、バックスラッシュが前に付いていても、一重引用符間に の間には現れません。

しかし、古いbashバージョンでは、これはBash 3.00.15(1)-releaseでは当てはまりません。これではありません

cmd: echo subshell echo hi 

#!/bin/bash 

func() { 
local -a cmds=('echo subshell echo hi') 

    for cmd in "${cmds[@]}"; do 
     echo "cmd: $cmd" 
    done 
} 

func 

プリント:

cmd: echo 
cmd: subshell 
cmd: echo 
cmd: hi 

私は予想に対し

は例えば、(これは大きなスクリプトの不自然な例です)考えます新しいbashバージョンの問題。上記はBash 3.2.25(1)-release4.3.46(1)-releaseで期待通りに動作します。

古いbashシェルのバグですか?単一引用符でbashの値(上記のように)を保持するように、どうすれば回避できますか3.00.15(1)-release

+2

なぜこのような古いbashバージョンをサポートする必要がありますか?何年もbashを更新していないOS Xも3.2.57である。 – Barmar

+0

間違いなくバグのようです。 'echo $ {#cmds [@]}'は何を表示しますか? – Barmar

+3

私はSOが10歳のバグレポートの正しい場所だとは思わない。この問題を回避するには、 'cmds [0] = 'foo bar'などのように要素を1つずつ割り当てる必要があります。そして、btw、シェルをアップグレードしてください... – hek2mgl

答えて

4

少なくともbash 3.00.16(手動で3.00にパッチを適用せずに最も近いコンパイルが可能)、localコマンドの割り当てを含むバグが関連しているように見えます。以下は、期待される出力を生成します。

func() { 
    local -a cmds 
    cmds=('echo subshell echo hi') 

    for cmd in "${cmds[@]}"; do 
     echo "cmd: $cmd" 
    done 
} 

func 

これはlocalに固有ではありません。引数として現れる処理の割り当てには問題があるようです。

bash-3.00$ declare -a foo=('echo bar') 
bash-3.00$ printf '%s\n' "${foo[@]}" 
echo 
bar 
bash-3.00$ foo=('echo bar') 
bash-3.00$ printf '%s\n' "${foo[@]}" 
echo bar 
関連する問題