GNU/Linux >> Znalost Linux >  >> Linux

Poskytnout dva argumenty k jedné možnosti pomocí Getopts?

V níže uvedeném kódu, když dám možnost r pak getopts vyžaduje jeden argument:

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

Ale musím předat dva argumenty za -r možnost místo jedné. Existuje snadný způsob, jak to udělat?

Přijatá odpověď:

Nemůžete předat dva argumenty s jednou možností pomocí getopts .

Doporučuji následující alternativy:

  1. Uveďte několik argumentů do uvozovek

    V tomto případě je getopts bude považovat za jeden argument, ale později jej budete moci rozdělit. Můžete dokonce vložit všechny argumenty do pole najednou:

    #!/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"
    

    Příklad spuštění:

    ./script -r "123 456 789"
    

    A výstup:

    Run Numbers - argument = 123 456 789 
    Number of arguments: 3
    Arguments are: 123, 456, 789
    
  2. Jako oddělovač použijte čárku (nebo jiný preferovaný znak)

    ./script -r 123,456,789
    

    a stačí nahradit IFS=" " s IFS=, v kódu výše. To má výhodu v tom, že umožňuje prázdné prvky.
    Jak bylo uvedeno v sekci komentářů, toto řešení volí některé běžné programy, např. lsblk -o NAME,FSTYPE,SIZE .

  3. Povolit více -r možnosti

    Více -r , ale každý má pouze jeden argument:

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

    Potom by se argumenty přidávaly do pole jeden po druhém

    array+=("$OPTARG")
    

    Ten má výhodu v tom, že nemá omezení na to, jaké znaky mohou prvky obsahovat.
    Toto je také používáno některými standardními linuxovými nástroji, např. awk -v var1=x -v var2=y .


Linux
  1. 8 úžasných argumentů příkazového řádku v Perlu, které byste měli vědět

  2. Jak sloučit dvě statické knihovny do jedné?

  3. Spojte dva řetězce v jednom řádku s grep

  1. Jak sloučit dva soubory pomocí AWK?

  2. Mohou dva uživatelé současně sdílet jeden počítač

  3. Hledání konkrétní možnosti v manuálové stránce

  1. Je možné nainstalovat dvě služby pro jeden balíček pomocí Dh_installinit? Jak?

  2. Dva různé montážní body s jedním zařízením

  3. Použití bridge utils k propojení dvou počítačů přes Linux