Kontrola počtu argumentov odovzdaných skriptu Bash

Chcel by som, aby môj skript Bash vypísal chybovú správu, ak nie je splnený požadovaný počet argumentov.

Vyskúšal som nasledujúci kód:

#!/bin/bash
echo Script name: $0
echo $# arguments 
if [$# -ne 1]; 
    then echo "illegal number of parameters"
fi

Z nejakého neznámeho dôvodu som dostal nasledujúcu chybu:

test: line 4: [2: command not found

Čo robím zle?

Riešenie

Tak ako každý iný jednoduchý príkaz, aj [ ... ] alebo test vyžaduje medzi svojimi argumentmi medzery.

if [ "$#" -ne 1 ]; then
    echo "Illegal number of parameters"
fi

Alebo

if test "$#" -ne 1; then
    echo "Illegal number of parameters"
fi

Návrhy

V jazyku Bash radšej používajte [[ ]], pretože v ňom nedochádza k deleniu slov a expanzii názvov ciest na premenné, ktoré nemusia byť citované, pokiaľ nie sú súčasťou výrazu.

[[ $# -ne 1 ]]

Má aj niektoré ďalšie funkcie, ako je zoskupovanie podmienok bez úvodzoviek, porovnávanie vzorov (rozšírené porovnávanie vzorov pomocou extglob) a porovnávanie regexov.

Nasledujúci príklad kontroluje, či sú argumenty platné. Povoľuje jeden alebo dva argumenty.

[[ ($# -eq 1 || ($# -eq 2 && $2 == )) && $1 =~  ]]

Pre čisto aritmetické výrazy môže byť pre niektoré stále lepšie použitie (( )), ale stále sú možné v [[ ]] s jeho aritmetickými operátormi ako -eq, -ne, -lt, -le, -gt, alebo -ge umiestnením výrazu ako jediného reťazcového argumentu:

A=1
[[ 'A + 1' -eq 2 ]] && echo true  ## Prints true.

To by malo byť užitočné, ak by ste to potrebovali kombinovať aj s inými funkciami [[ ]].

Ukončenie skriptu

Je'tiež logické, aby sa skript ukončil, keď sú mu odovzdané neplatné parametre. To už v komentároch navrhol ekangas, ale niekto túto odpoveď upravil tak, aby mala ako vrátenú hodnotu -1, takže by som to mohol urobiť aj ja.

-1 síce Bash akceptuje ako argument pre exit, ale nie je explicitne zdokumentovaný a nie je správne ho používať ako bežný návrh. 64 je tiež najformálnejšia hodnota, pretože je'definovaná v sysexits.h pomocou #define EX_USAGE 64 /* chyba použitia príkazového riadku */. Väčšina nástrojov, ako napríklad ls, tiež vracia 2 pri neplatných argumentoch. Aj ja som kedysi vo svojich skriptách vracal 2, ale v poslednom čase ma to už veľmi nezaujímalo a jednoducho som pri všetkých chybách používal 1. Ale dajme sem len 2, pretože je to najbežnejšie a pravdepodobne nie je špecifické pre operačný systém.

if [[ $# -ne 1 ]]; then
    echo "Illegal number of parameters"
    exit 2
fi

Referencie

Komentáre (2)

Ak pracujete s číslami, je vhodné použiť aritmetické výrazy.

if (( $# != 1 )); then
    echo "Illegal number of parameters"
fi
Komentáre (0)

Na []: !=, =, == ... sú reťazcové porovnávacie operátory a -eq, -gt ... sú aritmetické binárne operátory.

Použil by som:

if [ "$#" != "1" ]; then

Alebo:

if [ $# -eq 1 ]; then
Komentáre (3)