Je to starý citát, ale myslím, že tento princip vynálezce Perlu Larryho Walla stále platí:
"Líný programátor znovu použije vše, co může, aby dokončil svou práci. Tato ctnost vede k opětovnému použití kódu tím, že podporuje, aby byl kód napsán pouze jednou."
— Larry Wall, „Tři ctnosti programátora“
Řekněme, že vás unavuje psát stejnou posloupnost příkazů a nakonec vytvoříte pěkný skript shellu, který bude spouštět věci s menším počtem stisknutí kláves. Ale někdy to chcete spustit s různými argumenty a určitě nechcete duplikovat svůj skvělý skript. Potřebujete způsob, jak poskytovat a používat argumenty z příkazového řádku. Přesně to popisuje tento článek.
Zpracovat vstupy skriptů
Shell skripty mají přístup k některým "magickým" proměnným z prostředí:
$0
- Název skriptu$1
- První argument odeslaný skriptu$2
- Druhý argument odeslaný skriptu$3
- Třetí argument... a tak dále$#
- Počet poskytnutých argumentů$@
- Seznam všech poskytnutých argumentů
#!/bin/bash
if [ $# -eq 0 ];
then
echo "$0: Missing arguments"
exit 1
elif [ $# -gt 2 ];
then
echo "$0: Too many arguments: $@"
exit 1
else
echo "We got some argument(s)"
echo "==========================="
echo "Number of arguments.: $#"
echo "List of arguments...: $@"
echo "Arg #1..............: $1"
echo "Arg #2..............: $2"
echo "==========================="
fi
echo "And then we do something with $1 $2"
Zde je několik příkladů provedení s různými kombinacemi argumentů:
$ ./ex01.sh
./ex01.sh: Missing arguments
$ ./ex01.sh aa
We got some argument(s)
===========================
Number of arguments.: 1
List of arguments...: aa
Arg #1..............: aa
Arg #2..............:
===========================
And then we do something with aa
$ ./ex01.sh aa bb
We got some argument(s)
===========================
Number of arguments.: 2
List of arguments...: aa bb
Arg #1..............: aa
Arg #2..............: bb
===========================
And then we do something with aa bb
$ ./ex01.sh aa bb cc
./ex01.sh: Too many arguments: aa bb cc
To je v pořádku, pokud máte jeden nebo dva argumenty. Všimněte si však, že výchozím oddělovačem mezi argumenty je znak mezera. A protože mezera je výchozím oddělovačem argumentů, mohou se stát zajímavé věci. Například toto se stane, když použijete uvozovky s více než dvěma argumenty:
$ ./ex01.sh aa "bb cc xx yy zz"
We got some argument(s)
===========================
Number of arguments.: 2
List of arguments...: aa bb cc xx yy zz
Arg #1..............: aa
Arg #2..............: bb cc xx yy zz
===========================
And then we do something with aa bb cc xx yy zz
Všimněte si, že skript interpretuje bb cc xx yy zz
jako jeden argument, protože hodnoty jsou uzavřeny do dvojitých uvozovek, což je také v pořádku, pokud to chcete.
[ Mějte své linuxové příkazy vždy po ruce. Stáhněte si cheat sheet Advanced Linux commands. ]
Další zajímavá věc je, když váš skript získává argumenty z proměnných . Pokud proměnná obsahuje mezery, musíte se rozhodnout, zda to chcete hodnota, která má být považována za jeden argument, nebo všechny části jako různé argumenty:
$ export AUTHOR="John Lennon"
$ export SONG="Imagine"
$ ./ex01.sh $AUTHOR $SONG
./ex01.sh: Too many arguments: John Lennon Imagine
$ ./ex01.sh "$AUTHOR" "$SONG"
We got some argument(s)
===========================
Number of arguments.: 2
List of arguments...: John Lennon Imagine
Arg #1..............: John Lennon
Arg #2..............: Imagine
===========================
And then we do something with John Lennon Imagine
Když odešlete argumenty jako proměnné bez uvozovek, skript je všechny interpretuje jako samostatná slova a „vidí“ tři argumenty:Jan , Lennon a Představte si .
Pomocí uvozovek kolem proměnné způsobily, že skript obdrží každou proměnnou jako jeden argument, což v tomto případě dává větší smysl.
Zvládněte mnohem více argumentů
Jak jste viděli, magická proměnná $@
obsahuje seznam všech argumentů přijatých skriptem. Ke zpracování všech argumentů můžete použít cyklus:
#!/bin/bash
echo "We received $# argument(s)"
for i in "$@"
do
echo "Arg...: $i"
done
Což vám dává toto:
$ ./ex02.sh a b c e "stuff with spaces"
We received 5 argument(s)
Arg...: a
Arg...: b
Arg...: c
Arg...: e
Arg...: stuff with spaces
Být chytří tím, že budete líní
Při práci s argumenty ve skriptech shellu je důležité, abyste jasně rozuměli:
- Jakou formu může mít obsah argumentu?
- Pokud je uvedena jako proměnná, co za vás „odesílatel“ do této proměnné vložil?
- Pokud je poskytován uživatelským vstupem, jak můžete zajistit, aby uživatel „neporušil“ vaši logiku?
- Jaké argumenty jsou přijatelné nebo povinné pro vaše skript?
- Co chcete udělat, pokud jsou argumenty neplatné? Skript by mohl vyvolat chybu nebo možná použít výchozí hodnoty.
Doufám, že vám to pomůže pokračovat v lenošení správným způsobem... vylepšením nebo opětovným použitím některých vašich skriptů.