修正する これを見てください協会、0ではなく1で始まるように配列添字を更新しましたが、配列変数が正しく読み取られたようです。
#!/bin/bash
#Root folders for Git update.
ROOT[1]="/Users/ayusman/dev/repos1"
ROOT[2]="/Users/ayusman/dev/repos2"
#do some things with the ROOT variable.
ところで、先に宣言したシェル関数が認識されず、他の場所でエラーが見え始めました。
コマンドが見つかりません:git
だから一般的な質問は次のとおりです。
bashシェルで完全に機能するシェルスクリプトをzshシェルに移植するにはどうすればよいですか?
最近、MacをmacOS Catalina 10.15.2にアップグレードしました。
私のシェルスクリプトの1つは次のとおりです。
#!/bin/bash
#Root folders for Git update.
ROOT[0]="/Users/ayusman/dev/repos1"
ROOT[1]="/Users/ayusman/dev/repos2"
#do some things with the ROOT variable.
私のデフォルトのシェルがbashシェルだったとき、これはうまくいきました。ここで私がしたことは、シェルスクリプトで使用する配列変数にいくつかのフォルダを追加することです。アップグレードをリリースしてデフォルトのシェルをzshに設定した後、スクリプトを起動すると(.zsrcファイルのエイリアスを介して)、次のエラーが発生します。
[ayusman@~10:39AM]$updateExpediaGitRepos
/Users/ayusman/scripts/updateGitRepos.sh:250: ROOT: assignment to invalid subscript range
[ayusman@~10:39AM]$
シェルを再びbashに変更したとき(下記のようにchshを実行して)、同じスクリプトが期待どおりに実行されることを確認しました。
chsh -s /bin/bash
したがって、基本的に質問は既存のbashスクリプトを使用せずにzshシェルで実行できますか?
ありがとう、アユシュマン
ベストアンサー1
zsh
スクリプトの説明を要求しているようです。あなたはupdateExpediaGitRepos
それが何であるかを言わなかったが、私は考えた。alias
源泉このスクリプトは、.
またはsource
組み込みコマンドを使用します。このコマンドは現在シェルソルバーにファイルのコードを解釈するように指示するため、shebang(#! /bin/bash
)は関係ありません。 Shebang は、試している場合にのみカーネルで使用されます。実装するスクリプト。
おそらく、これはupdateGitRepos.sh
ユーザーシェルのプロパティ(環境変数の設定、関数定義、エイリアス定義など)を変更してユーザーエクスペリエンスをカスタマイズするために使用されます。これは実行には役立ちません。
bash
2つの異なる互換性のない言語の通訳者ですzsh
(どちらもBourneシェル、Kornシェル、Cシェルから多くのインスピレーションを得ているため共通です)。通常、ある人が他の人のために書かれたコードを解釈できると期待することはできません。
特に、配列は非常に異なる方法で実装されます。
zsh
配列は、実際にシェルで一般的に使用される他のほとんどのシェルやツールと同様に、インデックスが1から始まる配列です(詳細については、以下を参照してください)。Zsh配列の最初の要素にインデックスがゼロではなく1の理由がありますか?)。
bash
配列は Korn シェルからコピーされます。これはスパース配列(正の整数に制限されたキーを持つ連想配列に似ています)であり、インデックスは0から始まります。
zsh
複数のサポートシミュレーション他のシェル用に書かれたコードを解釈するために使用できます。特に、bash
配列を使用してスクリプトを解析するのに便利なkshエミュレーションモードがあります。
emulate ksh
始めてください。
または:
emulate ksh -c 'some code'
このシミュレーションモードでコードを評価します。このモードで宣言された関数はシミュレーションモードを継承します。
さらに、ksh
シミュレーションモードではこのKSH_ARRAYS
オプションがオンになっているため、配列インデックスは0から始まりますが、まだ希薄ではありません。
したがって、ここでエイリアスを変更して、次のように試すことができます。
emulate ksh -c '. /Users/ayusman/scripts/updateGitRepos.sh'
変える
. /Users/ayusman/scripts/updateGitRepos.sh
あなたの場合は、これで十分でも十分ではありません。このシミュレーションモードのみ改善する互換性のため、ksh
zsh を ksh レプリカにしません。そしてkshはbashではありません。
ユーザーのシェルをソースとして使用するには、サポートされているupdateGitRepos.sh
各シェルごとに適切な言語で書かれた異なるバージョンのスクリプトを提供するか、サポートされているすべてのシェルと互換性のある構文を使用する必要があります。通常、配列は除外されます。 (しかし参照アレイのテストシェルのサポート可能な方法)。
スクリプトがユーザーの対話型シェルによって解釈されず、単に実行される場合は、shebangの/path/to/the/script
おかげでスクリプトを実行すると、正しいソルバーが起動して解釈できます。 not 、not source /path/to/the/script
(zsh /path/to/the/script
bash /path/to/the/script
ここでも次のように動作します。これはbash
スクリプトです(誤解を招く.sh
拡張にもかかわらず))。