Saya mencoba menggunakan array di Bourne Shell (/bin/sh
). Saya menemukan bahwa cara untuk menginisialisasi elemen array adalah:
arr=(1 2 3)
Namun mengalami kesalahan:
syntax error at line 8: `arr=' unexpected
Sekarang posting di mana saya menemukan sintaks ini mengatakan itu untuk bash
, tetapi saya tidak dapat menemukan sintaks terpisah untuk Bourne Shell. Apakah sintaksnya sama untuk /bin/sh
juga?
Jawaban yang Diterima:
/bin/sh
hampir tidak pernah merupakan shell Bourne pada sistem apa pun saat ini (bahkan Solaris yang merupakan salah satu sistem utama terakhir yang menyertakannya kini telah beralih ke POSIX sh untuk /bin/sh di Solaris 11). /bin/sh
adalah cangkang Thompson di awal 70-an. Shell Bourne menggantikannya di Unix V7 pada 1979.
/bin/sh
telah menjadi shell Bourne selama bertahun-tahun setelahnya (atau shell Almquist, implementasi ulang gratis pada BSD).
Saat ini, /bin/sh
lebih umum seorang juru bahasa atau lainnya untuk POSIX sh
bahasa yang didasarkan pada subset dari bahasa ksh88 (dan superset dari bahasa shell Bourne dengan beberapa inkompatibilitas).
Bourne shell atau spesifikasi bahasa POSIX sh tidak mendukung array. Atau lebih tepatnya mereka hanya memiliki satu larik:parameter posisi ($1
, $2
, [email protected]
, jadi satu larik per fungsi juga).
ksh88 memang memiliki array yang Anda atur dengan set -A
, tapi itu tidak ditentukan dalam POSIX sh karena sintaksnya canggung dan tidak terlalu berguna.
Shell lain dengan variabel array/daftar termasuk:csh
/tcsh
, rc
, es
, bash
(yang sebagian besar menyalin sintaks ksh dengan cara ksh93), yash
, zsh
, fish
masing-masing dengan sintaks yang berbeda (rc
cangkang calon penerus Unix, fish
dan zsh
menjadi yang paling konsisten)…
Dalam standar sh
(juga berfungsi di shell Bourne versi modern):
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)
(perhatikan bahwa di Bourne shell dan ksh88, $IFS
harus berisi karakter spasi untuk "[email protected]"
untuk bekerja dengan baik (bug), dan di shell Bourne, Anda tidak dapat mengakses elemen di atas $9
(${10}
tidak akan bekerja, Anda masih dapat melakukan shift 1; echo "$9"
atau loop di atasnya)).