Saya mencoba menulis skrip tempat saya ingin memeriksa apakah ada parameter yang diteruskan ke skrip bash yang cocok dengan string. Cara saya mengaturnya sekarang adalah
if [ "$3" != "-disCopperBld" -a "$4" != "-disCopperBld" -a "$5" != "-disCopperBld" -a "$6" != "-disCopperBld"]
tetapi mungkin ada sejumlah besar parameter, jadi saya bertanya-tanya apakah ada cara yang lebih baik untuk melakukan ini?
Terima kasih
EDIT: Saya mencoba potongan kode ini, dan memanggil skrip dengan opsi, -disableVenusBld, tetapi masih mencetak "Mulai membangun". Apakah saya melakukan sesuatu yang salah? Terima kasih sebelumnya!
while [ $# -ne 0 ]
do
arg="$1"
case "$arg" in
-disableVenusBld)
disableVenusBld=true
;;
-disableCopperBld)
disableCopperBld=true
;;
-disableTest)
disableTest=true
;;
-disableUpdate)
disableUpdate=true
;;
*)
nothing="true"
;;
esac
shift
done
if [ "$disableVenusBld" != true ]; then
echo "Starting build"
fi
linux
unix
bash
shell-script
iman453
sumber
sumber
#! /bin/sh -
ke bagian atas apa yang Anda sertakan di sana, membuat skrip dapat dieksekusi, lalu./t.sh
mencetak "Mulai membangun", tetapi./t.sh -disableVenusBld
tidak mencetak apa pun.Jawaban:
Sepertinya Anda melakukan penanganan opsi dalam skrip shell. Inilah ungkapan untuk itu:
(Ada beberapa konvensi untuk indentasi
;;
, dan beberapa shell memungkinkan Anda untuk memberikan opsi sebagai(--opt1)
, untuk membantu pencocokan penjepit, tetapi ini adalah ide dasarnya)sumber
shift
pernyataan digunakan ketika jumlah argumen untuk perintah tidak diketahui sebelumnya, misalnya ketika pengguna dapat memberikan banyak argumen yang mereka suka. Dalam kasus seperti itu, argumen diproses dalam satuwhile
lingkaran dengan kondisi pengujian$#
. Kondisi ini berlaku selama jumlah argumen lebih besar dari nol. The$1
variabel danshift
pernyataan memproses setiap argumen. Jumlah argumen dikurangi setiap kalishift
dieksekusi dan akhirnya menjadi nol, di manawhile
loop keluar. sumberecho $1 | sed
pemrosesan nilai argumen tambahan .Ini berhasil untuk saya. Itu tidak persis apa yang Anda minta dan tidak lebih (tidak ada opsi pengolahan). Apakah itu baik atau buruk adalah latihan untuk poster :)
Ini mengambil keuntungan dari penanganan khusus
$*
dan bash kurung uji[[
…]]
.sumber
$*
menjadi$@
, karena string yang akan diuji mungkin memiliki spasi dan menambahkan tautan ke dokumentasi bash tentang hal itu.bash -c 'echo args=$*; [[ "$@" == "bar" ]] && echo YES || echo NO' -- foo bar
your string
. Saya pikir Anda perlu melakukan apa yang disarankan oleh jawaban ini . yaitu:bash -c 'echo args=$*; for i in "$@" ; do [[ $i == "bar" ]] && echo "Is set!" && break ; done' -- bar foo
akan bekerja.create a new certificate
dan "string Anda" adalahcat
, ini akan melaporkan kecocokan karenacertificate
berisicat
.Bagaimana dengan mencari (dengan wildcard) seluruh ruang parameter:
Sunting: Oke, oke, jadi itu bukan jawaban yang populer. Bagaimana dengan yang ini, sempurna !:
Edit2: Ok, ok, mungkin ini tidak sempurna ... Pikirkan itu hanya berfungsi jika -param ada di awal daftar dan juga akan cocok dengan -paramXZY atau -paramABC. Saya masih berpikir masalah asli dapat diselesaikan dengan sangat baik dengan manipulasi string bash, tapi saya belum cukup memecahkannya di sini ... -Bisakah Anda ??
sumber
${@#
)?$@
adalah variabel khusus yang menampung semua argumen baris perintah? Yah saya baru saja menggunakan manipulasi string Bash pada variabel itu untuk menghapus substring "-disableVenusBld", dan kemudian saya membandingkannya dengan yang asli$@
. Jadi jika$@
sama-foo -bar
maka${@#-disableVenusBld}
masih-foo -bar
, jadi saya bisa melihat bahwa bendera yang saya cari tidak ada. Namun, jika$@
sama-foo -disableVenusBld -bar
maka${@#-disableVenusBld}
akan menjadi-foo -bar
yang tidak sama dengan$@
, dengan demikian memberitahu saya bahwa bendera yang saya cari ada! Keren ya!Jika Anda hanya perlu menguji parameter mulai dari
$3
, lakukan pencarian dalam suatu fungsi:Tapi saya heran mengapa Anda mencoba melakukan ini sejak awal, itu bukan kebutuhan umum. Biasanya, Anda akan memproses opsi secara berurutan, seperti pada jawaban Dennis untuk pertanyaan Anda sebelumnya .
sumber