0

元のタイトル:スクリプトをソース (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

スクリプトをソースするとパラメーター展開の動作が変わる理由がわかりません。

これは予想される動作ですか?もしそうなら、誰かがそれを説明し、できれば回避策を​​提供できればありがたいです。

4

2 に答える 2