Saya bukan orang Linux tetapi terjebak dalam beberapa Script yang harus saya baca untuk Proyek saya. Jadi adakah yang bisa membantu saya apa yang dilakukan perintah ini?
shift $(($optind - 1))
Saya bukan orang Linux tetapi terjebak dalam beberapa Script yang harus saya baca untuk Proyek saya. Jadi adakah yang bisa membantu saya apa yang dilakukan perintah ini?
shift $(($optind - 1))
Jawaban:
shift $((OPTIND-1))
(note OPTIND
adalah huruf besar) biasanya ditemukan segera setelah satu getopts
while
loop. $OPTIND
adalah jumlah opsi yang ditemukan oleh getopts
.
Seperti yang disebutkan pauljohn32 dalam komentar, secara tegas, OPTIND
memberikan posisi argumen baris perintah berikutnya .
Dari Manual Referensi Bash GNU :
getopts optstring name [args]
getopts
digunakan oleh skrip shell untuk mengurai parameter posisi.optstring
berisi karakter opsi untuk dikenali; jika karakter diikuti oleh titik dua, opsi diharapkan memiliki argumen, yang harus dipisahkan darinya oleh spasi. Tanda titik dua (':') dan tanda tanya ('?') Tidak boleh digunakan sebagai karakter opsi. Setiap kali dipanggil,getopts
tempat opsi berikutnya dalam nama variabel shell, inisialisasiname
jika tidak ada, dan indeks argumen berikutnya untuk diproses menjadi variabelOPTIND
.OPTIND
diinisialisasi ke 1 setiap kali shell atau script shell dipanggil. Ketika opsi membutuhkan argumen, getopts menempatkan argumen itu ke dalam variabelOPTARG
. Shell tidak meresetOPTIND
secara otomatis; itu harus secara manual mengatur ulang antara beberapa panggilan kegetopts
dalam permintaan shell yang sama jika satu set parameter baru akan digunakan.Ketika akhir opsi ditemukan,
getopts
keluar dengan nilai kembali lebih besar dari nol.OPTIND
diatur ke indeks argumen non-opsi pertama, dan nama diatur ke '?'.
getopts
biasanya mem-parsing parameter posisi, tetapi jika lebih banyak argumen diberikanargs
,getopts
parsing itu sebagai gantinya.
shift
n
menghapus n string dari daftar parameter posisi. Dengan demikian shift $((OPTIND-1))
menghapus semua opsi yang telah diuraikan oleh getopts
dari daftar parameter, dan setelah titik itu, $1
akan merujuk pada argumen non-opsi pertama yang diteruskan ke skrip.
Memperbarui
Seperti mikeserv menyebutkan dalam komentar, shift $((OPTIND-1))
bisa jadi tidak aman. Untuk mencegah pemisahan kata yang tidak diinginkan dll, semua ekspansi parameter harus dikutip ganda. Jadi bentuk aman untuk perintah adalah
shift "$((OPTIND-1))"
find
) mungkin terlihat seperti mereka mengizinkan opsi setelah non-opsi, tetapi mereka tidak: mereka memiliki operan yang dimulai dengan tanda hubung.
IFS
, tetapi lebih baik aman daripada menyesal. ;)
IFS=0123456789
, shift $((OPTIND-1))
(tanpa tanda kutip) akan berubah menjadi shift ""
mana yang akan diabaikan (dalam ksh
) secara diam-diam atau menghasilkan kesalahan (dalam bash
dan dash
).
$((...))
hanya menghitung barang. Dalam kasus Anda dibutuhkan nilai $optint
dan kurang 1.
shift
menghapus parameter posisi. Dalam kasus Anda itu menghapus optint-1
parameter.
Untuk informasi lebih lanjut kita lihat help getopts
, help shift
, lihat man bash
untuk "Ekspansi Aritmatika", dan terutama google untuk getopts
.