GNU/Linux >> Linux の 問題 >  >> Linux

Unix Bourne Shellの配列?

Bourneシェル(/bin/sh)で配列を使用しようとしています )。配列要素を初期化する方法は次のとおりです。

arr=(1 2 3)

しかし、エラーが発生しています:

syntax error at line 8: `arr=' unexpected

この構文を見つけた投稿には、bash用であると書かれています。 、しかし、Bourneシェルの個別の構文は見つかりませんでした。 /bin/shの構文は同じですか? 同様に?

承認された回答:

/bin/sh 現在、どのシステムでもBourneシェルになることはほとんどありません(これを含む最後の主要システムの1つであったSolarisでさえ、Solaris11の/bin /shをPOSIXshに切り替えました)。 /bin/sh 70年代初頭のトンプソンシェルでした。 Bourneシェルは、1979年にUnixV7で置き換えられました。

/bin/sh その後何年もの間Bourneシェル(またはAlmquistシェル、BSDでの無料の再実装)でした。

現在、/bin/sh より一般的には、POSIX shのインタプリタまたは別のインタプリタです。 それ自体がksh88の言語のサブセットに基づく言語(およびいくつかの非互換性を備えたBourneシェル言語のスーパーセット)。

BourneシェルまたはPOSIXsh言語仕様は、配列をサポートしていません。むしろ、配列は1つだけです。位置パラメータ($1$2[email protected] 、したがって、関数ごとに1つの配列もあります。

ksh88には、set -Aで設定した配列がありました。 、しかし、構文が扱いにくく、あまり使い勝手が悪いため、POSIXshでは指定されませんでした。

配列/リスト変数を持つ他のシェルには、次のものがあります。csh / tcshrcesbash (これは主にksh構文をksh93の方法でコピーしました)、yashzshfish それぞれ構文が異なります(rc Unixの後継となるfishのシェル およびzsh 最も一貫性のあるものである)…

標準のsh (Bourneシェルの最新バージョンでも機能します):

set '1st element' 2 3 # setting the array

set -- "[email protected]" more # adding elements to the end of the array

shift 2 # removing elements (here 2) from the beginning of the array

printf '<%s>n' "[email protected]" # passing all the elements of the [email protected] array 
                     # as arguments to a command

for i do # looping over the  elements of the [email protected] array ($1, $2...)
  printf 'Looping over "%s"n' "$i"
done

printf '%sn' "$1" # accessing individual element of the array.
                   # up to the 9th only with the Bourne shell though
                   # (only the Bourne shell), and note that you need
                   # the braces (as in "${10}") past the 9th in other
                   # shells (except zsh, when not in sh emulation and
                   # most ash-based shells).

printf '%sn' "$# elements in the array"

printf '%sn' "$*" # join the elements of the array with the 
                   # first character (byte in some implementations)
                   # of $IFS (not in the Bourne shell where it's on
                   # space instead regardless of the value of $IFS)

(Bourneシェルとksh88では、$IFS "[email protected]"のスペース文字を含める必要があります 正しく動作するため(バグ)、Bourneシェルでは、$9を超える要素にアクセスできません。 (${10} 動作しませんが、shift 1; echo "$9" またはそれらをループします))。

関連:$ SHELLはLinuxのデフォルトシェルへのパスを保存しますか?
Linux
  1. TMOUT – アクティビティがない場合に Unix シェルを自動的に終了する

  2. Unix コンソールまたは Mac 端末でシェル スクリプトを実行するには?

  3. UNIXシェル変数への改行文字の追加

  1. Mac Os X Unixですか?

  2. Linux/Unix で $PATH を永続的に設定するには?

  3. export の Unix シェル変数のスコープは何ですか?

  1. Unixでシェルコマンドを編集するためにViキーを使用しますか?

  2. Unixシェルスクリプトのファイル拡張子?

  3. Unix シェルのヒント:ログイン シェルを Bash からその他に変更する