Apa arti $ {1: 0: 2} dalam konteks ini?

19

Saya melihat ke kode yang ditampilkan di bawah dan memeriksa input jika argumen baris / kolom dimulai dengan salah satu -ratau -c. Apa ${1:0:2}artinya dalam konteks ini?

rowArgName="-r"
colArgName="-c"
if [ "${1:0:2}" != $rowArgName ] && [ "${1:0:2}" != $colArgName ]
then
   echo $correctCmdMsg >&2
   exit 1
fi
pengguna165213
sumber
7
Anda harus memasukkan shell yang Anda gunakan ke dalam pertanyaan. Yang mungkin bash.
Raphael Ahrens
2
Ini tampaknya dilakukan untuk menguraikan argumen baris perintah. Mungkin Anda ingin tahu tentang getoptatau getoptsmembuat hidup Anda lebih mudah (atau kehidupan siapa pun yang melakukan ini).
Carlos Campderrós

Jawaban:

31

Ini adalah pola Substring Expansion (subclass of Parameter Expansion) shell.

Formatnya adalah:

${parameter:offset:length}

dan pengindeksan dimulai pada 0.

Katakanlah, Anda memiliki variabel foo, lalu ${foo:0:2}menghasilkan dua karakter pertama (dari posisi 0 2 berikutnya).

Contoh:

$ foo=spamegg
$ echo "${foo:0:2}"
sp

Dalam kasus Anda, angka pertama 1,, merujuk ke nama variabel $1, yang merupakan argumen pertama yang dikirimkan melalui baris perintah (dalam program utama) atau argumen pertama yang dilewatkan ke fungsi.

Jadi dalam kasus Anda, "${1:0:2}"akan:

  • mulai mengekstraksi substring mulai dari indeks 0 yaitu karakter pertama

  • dan lanjutkan ke dua karakter berikutnya

jadi setelah operasi Anda akan mendapatkan dua karakter pertama (diindeks pada 0 dan 1) dari string input.

The [ "${1:0:2}" != $rowArgName ]dan [ "${1:0:2}" != $colArgName ]sedang memeriksa apakah subtring output sama dengan beberapa string lainnya.

heemayl
sumber
1
Intinya adalah memeriksa apakah pengguna menyediakan $ 1 -catau tidak -r, yang mungkin lebih baik telah diterapkan dengangetopts
Sergiy Kolodyazhnyy
15

Ekstrak kecil dari man bash:

$ {parameter: offset: length}

Ekspansi Substring . Perluas hingga lengthkarakter dengan nilai parametermulai dari karakter yang ditentukan oleh offset. Jika parameternya adalah @, array yang diindeks di-subscript oleh @atau *, atau nama array asosiatif, hasilnya berbeda seperti yang dijelaskan di bawah ini. Jika lengthdihilangkan, perluas substring nilai parametermulai dari karakter yang ditentukan oleh offset dan meluas ke akhir nilai. length dan offset merupakan ekspresi aritmatika (lihat EVALUASI ARITHMETIC di bawah).

Ralph Rönnquist
sumber
5

Ini adalah ekstraksi substring sederhana dari suatu variabel. Variabel yang dimaksud adalah parameter pertama ke skrip (yang 1).

Jika saya memiliki variabel, FOO, saya dapat melihat dua karakter pertama nilainya ${FOO:0:2}. Hal yang sama sedang dilakukan dalam contoh Anda dengan argumen pertama.

DopeGhoti
sumber