$ bash file.sh expected_arg -f optional_arg
Saya telah melihat posting yang alamatnya menggunakan $1
untuk mengambil argumen pertama
dan memposting alamat tersebut menggunakan getopts untuk mengurai argumen flag. Saya belum melihat postingan yang membahas keduanya.
Saat ini saya mengakses expected_arg
melalui $1
.
Saya tidak dapat memproses -f
bendera sama sekali. Meskipun saya juga memiliki ini di skrip pengujian saya:
#!/bin/bash
dirname=$1
[[ -z $dirname ]] && echo "Project name required as an argument." && return
# get flags
verbose='false'
aflag='false'
bflag='false'
files='false'
while getopts 'abf:v' flag; do
case "${flag}" in
a) aflag='true' ;;
b) bflag='true' ;;
f) files="${OPTARG}" ;;
v) verbose='true' ;;
*) error "Unexpected option ${flag}" ;;
esac
done
echo "$files"
echo "$HOME/Desktop/$dirname"
exit
Terminal menunjukkan:
Jills-MBP:~ jillr$ bash test.sh blah -f file
false
/Users/jillr/Desktop/blah
Kecuali Saya mengganti urutan argumen, seperti pada:
bash file.sh -f optional_arg expected_arg
Yang mana keluaran terminal:
Jills-MBP:~ jillr$ bash test.sh -f file blah
file
/Users/jillr/Desktop/-f
Jadi secara alami, -f diproses sebagai $1
, yang bukan yang saya inginkan. Saya perlu mengambil yang diharapkan_arg
Pembatasan yang dibutuhkan:
- Saya perlu mengizinkan jumlah flag yang bervariasi (dari tidak ada sama sekali hingga beberapa). Oleh karena itu, posisi ekspektasi_arg akan bervariasi
- harapan_arg adalah suatu keharusan
- Saya lebih suka menghindari penggunaan flag lain untuk mengurai expect_arg (seperti, saya ingin menghindari melakukan sesuatu seperti
$ bash test.sh -f file -d blah
)
Bagaimana saya dapat memenuhi batasan tersebut?
Jawaban yang Diterima:
Lupakan. Saya menemukan posting ini:Menggunakan getopts untuk mengurai opsi setelah argumen non-opsi
yang pada dasarnya mengatakan saya dapat menyelesaikan masalah saya hanya dengan menempatkan shift
setelah dirname=$1
Yang akan memungkinkan untuk memasukkan argumen sebagai
$ bash file.sh expected_arg -f optional_arg