GNU/Linux >> Belajar Linux >  >> Linux

Bash — Parse Flags Dan Argumen yang Diharapkan (non-opsional)?

$ 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

Linux
  1. Kelanjutan Baris Bash Setelah &&Dan || Didokumentasikan?

  2. Contoh Bash For Loop dan While Loop

  3. Bagaimana cara mengurai file CSV di Bash?

  1. Menggunakan dan di Bash while loop

  2. Pertahankan Kutipan dalam argumen bash

  3. Bash - Perintah tanggal dan spasi

  1. Di Bash, Kapan Alias ​​​​Kapan Skrip, Dan Kapan Menulis Fungsi?

  2. Perbedaan antara ${} dan $() di Bash

  3. kunci ssh ssh-agent bash dan ssh-add