GNU/Linux >> Belajar Linux >  >> Linux

Berikan Dua Argumen Untuk Satu Opsi Menggunakan Getopts?

Dalam kode di bawah ini ketika saya memberikan opsi r lalu getopts membutuhkan satu argumen:

while getopts ":hr::l:" opt; do
    case $opt in
        r ) echo "Run Numbers - argument = $OPTARG " ;;
        l ) echo "Latency range - argument = $OPTARG" ;;
        h ) helptext
            graceful_exit ;;
        * ) usage
            clean_up
            exit 1
    esac
done

Tapi saya harus memberikan dua argumen setelah -r pilihan, bukan satu. Apakah ada cara mudah untuk melakukannya?

Jawaban yang Diterima:

Anda tidak dapat melewatkan dua argumen dengan opsi tunggal menggunakan getopts .

Saya merekomendasikan alternatif berikut:

  1. Menempatkan tanda kutip di sekitar beberapa argumen

    Dalam hal ini getopts akan memperlakukannya sebagai satu argumen, tetapi Anda akan dapat membaginya nanti. Anda bahkan dapat memasukkan semua argumen ke dalam array sekaligus:

    #!/bin/bash  
    
    while getopts ":hr:l:" opt; do
        case $opt in
            r ) echo "Run Numbers - argument = $OPTARG "
                set -f # disable glob
                IFS=' ' # split on space characters
                array=($OPTARG) ;; # use the split+glob operator
            l ) echo "Latency range - argument = $OPTARG" ;;
            h ) helptext
                graceful_exit ;;
            * ) usage
                clean_up
                exit 1
        esac
    done
    
    echo "Number of arguments: ${#array[@]}"
    echo -n "Arguments are:"
    for i in "${array[@]}"; do
      echo -n " ${i},"
    done
    printf "b n"
    

    Contoh menjalankan:

    ./script -r "123 456 789"
    

    Dan keluaran:

    Run Numbers - argument = 123 456 789 
    Number of arguments: 3
    Arguments are: 123, 456, 789
    
  2. Gunakan koma (atau karakter pilihan lainnya) sebagai pembatas

    ./script -r 123,456,789
    

    dan Anda hanya mengganti IFS=" " dengan IFS=, dalam kode di atas. Yang itu memiliki keuntungan mengizinkan elemen kosong.
    Seperti yang ditunjukkan di bagian komentar, solusi ini dipilih oleh beberapa program umum mis. lsblk -o NAME,FSTYPE,SIZE .

  3. Izinkan beberapa -r opsi

    Beberapa -r , tetapi masing-masing hanya mengambil satu argumen:

    ./script -r 123 -r 456 -r 789
    

    Kemudian argumen akan ditambahkan ke array satu per satu

    array+=("$OPTARG")
    

    Yang satu ini memiliki keuntungan karena tidak memiliki batasan pada karakter apa yang mungkin dikandung elemen.
    Yang ini juga digunakan oleh beberapa alat linux standar, mis. awk -v var1=x -v var2=y .


Linux
  1. Apakah Mungkin Menginstal Dua Layanan Untuk Satu Paket Menggunakan Dh_installinit? Bagaimana?

  2. Jalankan Perintah Menggunakan Argumen yang Berasal Dari Array?

  3. 8 Argumen Baris Perintah Perl yang Luar Biasa Yang Harus Anda Ketahui

  1. Bagaimana cara menggabungkan dua perpustakaan statis menjadi satu?

  2. Cocokkan dua string dalam satu baris dengan grep

  3. Menggabungkan dua file secara manual menggunakan diff

  1. Bisakah dua pengguna secara bersamaan berbagi satu pc

  2. Dua titik pemasangan berbeda dengan satu perangkat

  3. Menggunakan utils jembatan untuk menghubungkan dua komputer melalui Linux