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)-release
と4.3.46(1)-release
で期待通りに動作します。
古いbashシェルのバグですか?単一引用符でbashの値(上記のように)を保持するように、どうすれば回避できますか3.00.15(1)-release
?
なぜこのような古いbashバージョンをサポートする必要がありますか?何年もbashを更新していないOS Xも3.2.57である。 – Barmar
間違いなくバグのようです。 'echo $ {#cmds [@]}'は何を表示しますか? – Barmar
私はSOが10歳のバグレポートの正しい場所だとは思わない。この問題を回避するには、 'cmds [0] = 'foo bar'などのように要素を1つずつ割り当てる必要があります。そして、btw、シェルをアップグレードしてください... – hek2mgl