GNU/Linux >> Znalost Linux >  >> Linux

Jak používat vstupy ve skriptech shellu

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ů.


Linux
  1. Jak nastavit proměnnou $PATH v Linuxu

  2. Jak používat dd v Linuxu bez zničení disku

  3. Jak zacházet s přepínači ve skriptu Shell?

  1. Jak zrušit kořenová oprávnění ve skriptech Shell?

  2. Jak používat booleovské hodnoty v rybí skořápce?

  3. Jak používat váš dedikovaný server

  1. Funkce Bash a jak ji používat {Proměnné, argumenty, návrat}

  2. Jak používat proměnné ve skriptování Shell

  3. Jak používat příkaz su přes adb shell?