Apa artinya $ {@: 2} ini dalam skrip shell

27

Saya melihat ini dalam skrip shell.

variable=${@:2}

Apa yang sedang dilakukannya?

Lenin Raj Rajasekaran
sumber
Apakah persis seperti itu yang ditunjukkan dalam naskah? Sintaksnya terlihat seperti array tetapi hilang beberapa bagian. Bisakah Anda memposting beberapa baris di sekitar baris ini dari skrip?
slm
Itu adalah variabel mulai dari huruf kedua. var="my_value"; echo var="${var[@]:2}"; echo "$var"Lihat perbedaannya?
Valentin Bajrami

Jawaban:

34

Itu menunjukkan isi dari variabel khusus $@, di Bash. Ini berisi semua argumen baris perintah, dan perintah ini mengambil semua argumen dari yang kedua dan menyimpannya dalam variabel variable,.

Contoh

Berikut ini skrip exampe.

#!/bin/bash

echo ${@:2}

variable=${@:3}
echo $variable

Contoh dijalankan:

./ex.bash 1 2 3 4 5
2 3 4 5
3 4 5

Referensi

slm
sumber
9
Perhatikan bahwa teknik yang ditampilkan menyembunyikan argumen yang diberikan menjadi string tunggal. Jika Anda perlu menyimpannya sebagai argumen yang terpisah, gunakan array:vars=( "${@:2}" )
glenn jackman
@glennjackman - terima kasih telah menunjukkan itu.
slm
2
Perhatikan juga penggunaan kurung keriting. Anda seharusnya selalu menggunakan kurung keriting, tetapi Bash memungkinkan Anda untuk menghilangkannya ketika konteksnya tidak ambigu. Oleh karena itu, $@dan ${@}identik, meskipun yang terakhir adalah sintaks "lebih benar". Anda harus menggunakan tanda kurung ${@:2}, karena $@:2bersifat ambigu dan karenanya akan ditafsirkan sebagai ${@}:2, yang bukan hal yang sama.
Paddy Landau
14

Itu kshfitur yang juga ditemukan di bashdan versi terbaru dari zsh.

Di kshdan bash, Anda dapat mengakses beberapa elemen array dengan menggunakan ${array[@]:first:length}sintaks, yang meluas hingga length(atau semua jika lengthdihilangkan) elemen arrayarray (dalam daftar elemen array yang diurutkan secara numerik pada indeks), dimulai dengan yang pertama dengan indeks lebih besar atau sama dengan first. Ketika dalam konteks skalar (seperti di sini dalam penugasan ke variabel skalar) daftar elemen digabungkan dengan karakter spasi dengan bashdan ksh93dan dengan karakter pertama dari $IFS(atau tidak ada apa-apa jika $IFSkosong atau spasi jika tidak disetel) dengan zsh.

Contohnya:

$ a[23]=a a[5]=b a[235]=c a[45]=d
$ x=${a[@]:12:2}; printf '<%s>\n' "$x"
<a d>

$@adalah kasus khusus. $@adalah larik parameter posisi ( $1, $2...). Namun saat digunakan bersama :, $0juga disertakan. Begitu ${@:1}juga dengan $@, tidak ${@:0}seperti untuk array lainnya.

Dalam zsh, ini sedikit berbeda. zshmenambahkan kshsintaks hanya baru-baru ini untuk kompatibilitas tetapi memiliki sintaks sendiri untuk memilih rentang elemen.

Bertentangan dengan kshdan bash, zsharray adalah tipe variabel yang berbeda dari variabel skalar, tidak jarang ( zshmemiliki array asosiatif sebagai tipe variabel lain) dan mulai pada indeks 1 bukannya 0.

Sebab zsh, Anda mengakses rentang elemen array dengan $a[first,last](di mana lastjuga bisa negatif untuk menghitung mundur dari akhir).

Di zsh,

a[23]=a a[5]=b a[235]=c a[45]=d

menciptakan array dengan 235 elemen, sebagian besar kosong. $a[12,50]akan memperluas ke elemen 12 hingga 50, dan ${a[@]:12:2}hanya akan memperluas ke (kosong) $a[12]dan $a[13]elemen. Sebagai kasus khusus, dan sekali lagi untuk portabilitas dengan ksh93dan bash, zshjuga menerima 0elemen pertama untuk $@dan memperlakukannya sebagai $0.

Jadi, Anda dapat menggunakan ${a[@]:x:n}dan ${@:x:n}portable di ketiga shell, tetapi hanya untuk array non-sparse, dan memperhatikan nilai IFS.

Stéphane Chazelas
sumber