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
/ tcsh
、rc
、es
、bash
(これは主にksh構文をksh93の方法でコピーしました)、yash
、zsh
、fish
それぞれ構文が異なります(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"
またはそれらをループします))。