Saya mencoba menggunakan array di shell Bourne ( /bin/sh
). Saya menemukan bahwa cara untuk menginisialisasi elemen array adalah:
arr=(1 2 3)
Tetapi sedang 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 yang terpisah untuk shell Bourne. Apakah sintaksinya juga sama /bin/sh
?
shell
array
bourne-shell
SubhasisM
sumber
sumber
Jawaban:
/bin/sh
hampir tidak pernah menjadi 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 menggantinya di Unix V7 pada tahun 1979./bin/sh
telah menjadi cangkang Bourne selama bertahun-tahun sesudahnya (atau cangkang Almquist, implementasi ulang gratis pada BSD).Saat ini,
/bin/sh
lebih umum penerjemah atau yang lain untuksh
bahasa POSIX yang itu sendiri didasarkan pada subset dari bahasa ksh88 (dan superset dari bahasa shell Bourne dengan beberapa ketidakcocokan).Shell Bourne atau spesifikasi bahasa POSIX sh tidak mendukung array. Atau lebih tepatnya mereka hanya memiliki satu array: parameter posisi (
$1
,$2
,$@
, sehingga array satu per fungsi juga).ksh88 memang memiliki array yang Anda set dengan
set -A
, tetapi itu tidak bisa ditentukan dalam POSIX sh karena sintaksinya canggung dan tidak bisa digunakan.Kerang lain dengan variabel array / daftar meliputi:
csh
/tcsh
,rc
,es
,bash
(yang sebagian besar disalin sintaks ksh cara ksh93),yash
,zsh
,fish
masing-masing dengan sintaks yang berbeda (rc
cangkang sekali to-be penerus Unix,fish
danzsh
yang paling konsisten yang) ...Dalam standar
sh
(juga berfungsi dalam versi modern dari shell Bourne):(perhatikan bahwa di shell Bourne dan ksh88,
$IFS
harus berisi karakter spasi untuk"$@"
berfungsi dengan benar (bug), dan di shell Bourne, Anda tidak dapat mengakses elemen di atas$9
(${10}
tidak akan berfungsi, Anda masih bisa melakukanshift 1; echo "$9"
atau mengulang mereka)).sumber
"${@:2:4}"
. Yang pasti, saya melihat kesamaan , tapi saya tidak menganggap parameter posisi sebagai array per se."$@"
bertindak seperti sebuah array (seperti arraycsh
,rc
,zsh
,fish
,yash
...), itu lebih Korn / bash "array" yang tidak benar-benar array, tetapi beberapa bentuk array asosiatif dengan kunci terbatas pada bilangan bulat positif (mereka juga memiliki indeks mulai dari 0 bukannya 1 seperti di semua shell lain dengan array dan "$ @"). Shell yang memiliki dukungan untuk mengiris dapat mengiris $ @ sama saja (dengan ksh93 / bash menambahkan $ 0 ke parameter posisi dengan canggung ketika Anda mengiris "$ @").Tidak ada array di shell Bourne polos. Anda bisa menggunakan cara berikut untuk membuat array dan melewatinya:
Tidak peduli bagaimana cara menggunakan array yang
sh
Anda pilih, itu akan selalu rumit. Pertimbangkan untuk menggunakan bahasa yang berbeda sepertiPython
atauPerl
jika Anda bisa kecuali Anda terjebak dengan platform yang sangat terbatas atau ingin belajar sesuatu.sumber
$(...)
sintaksis. Jadi, Anda memang harus memiliki kulit Bourne. Apakah Anda menggunakan Solaris 10 atau sebelumnya? Kemungkinannya adalah Anda tidak akan memilikiseq
keduanya. Pada Solaris 10 dan sebelumnya, Anda ingin / usr / xpg4 / bin / sh memiliki standar,sh
bukan shell Bourne. Menggunakanseq
cara itu juga tidak terlalu baik.seq
cara itu tidak baik?$(...)
atas`
, tetapi OP/bin/sh
mungkin shell Bourne, bukan shell POSIX. Selainseq
tidak menjadi perintah standar, melakukan$(seq 100)
berarti menyimpan seluruh output dalam memori, dan itu berarti itu tergantung pada nilai saat ini dari $ IFS yang mengandung baris baru dan tidak mengandung angka. Terbaik untuk digunakani=1; while [ "$i" -le 100 ]; ...; i=$(($i + 1)); done
(meskipun itu tidak akan bekerja di shell Bourne baik)./bin/sh
sintaks portabel kemudian, cenderung membuat orang berpikir bahwa boleh saja menggunakan#!/bin/sh
shebang yang salah , dan kemudian memecah skrip mereka ketika orang lain mencoba menggunakannya. Anda disarankan untuk tidak memposting jenis flamebait ini. :)Seperti yang dikatakan orang lain, Shell Bourne tidak memiliki array yang benar .
Namun, tergantung pada apa yang perlu Anda lakukan, string yang dibatasi harus mencukupi:
Jika pembatas tipikal (spasi, tab, dan baris baru) tidak cukup, Anda dapat mengatur
IFS
pembatas apa pun yang Anda inginkan sebelum loop.Dan jika Anda perlu membangun array secara terprogram, Anda bisa membangun string yang dibatasi.
sumber
split+glob
operator).Cara untuk mensimulasikan array di dash (dapat diadaptasi untuk sejumlah dimensi array): (Harap dicatat bahwa penggunaan
seq
perintah mengharuskan yangIFS
diatur ke '' (SPACE = nilai default). Anda dapat menggunakanwhile ... do ...
ataudo ... while ...
loops sebagai gantinya untuk menghindari ini (saya menyimpannyaseq
dalam lingkup ilustrasi yang lebih baik tentang apa yang dilakukan kode).)sumber
local
didukung oleh keduanyabash
dandash
, itu bukan POSIX.seq
juga bukan perintah POSIX. Anda mungkin harus menyebutkan bahwa kode Anda membuat beberapa asumsi pada nilai saat ini dari $ IFS (jika Anda menghindari menggunakanseq
dan mengutip variabel-variabel Anda, itu dapat dihindari)