元のタイトル:スクリプトをソース (zsh) にすると、間接的なパラメーター置換が壊れる
zsh 5.7.1 (x86_64-apple-darwin19.0)
GNU bash、バージョン 4.4.20(1) リリース (x86_64-pc-linux-gnu)
私は Mac でシェル スクリプトを開発しており、bash と zsh の間で移植できるようにしようとしているので、配列のインデックス作成が考慮されます。KSH_ARRAYS を設定してインデックス作成を 0 から開始できることはわかっていますが、OS に使用中のシェルを照会し、それに応じて開始インデックスを設定することにしたため、以下で説明する問題が発生しました。
問題の原因となった間接展開を使用することは (とにかく私にとっては!) 理にかなっています。スクリプト indirect.sh を検討してください。
#! /bin/bash
declare -r ARRAY_START_BASH=0
declare -r ARRAY_START_ZSH=1
declare -r SHELL_BASH=0
declare -r SHELL_ZSH=1
# Indirect expansion is used to reference the values of the variables declared
# in this case statement e.g. ${!ARRAY_START}
case $(basename $SHELL) in
"bash" )
declare -r SHELL_ID=SHELL_BASH
declare -r ARRAY_START=ARRAY_START_BASH
;;
"zsh" )
declare -r SHELL_ID=SHELL_ZSH
declare -r ARRAY_START=ARRAY_START_ZSH
;;
* )
return 1
;;
esac
echo "Shell ID: ${!SHELL_ID} Index arrays from: ${!ARRAY_START}"
同じディレクトリにいるときにコマンドラインから実行すると、正常に動作します。
<my home> ~ % echo "$(./indirect.sh)"
Shell ID: 1 Index arrays from: 1
スクリプトをソースするときに問題が発生します。
<my home> ~ % echo "$(. ~/indirect.sh)"
/Users/<me>/indirect.sh:28: bad substitution
スクリプトをソースするとパラメーター展開の動作が変わる理由がわかりません。
これは予想される動作ですか?もしそうなら、誰かがそれを説明し、できれば回避策を提供できればありがたいです。