Bash se dodává s řadou vestavěných příkazů, které můžete použít na příkazovém řádku nebo ve skriptech shellu.
V tomto článku prozkoumáme vestavěné read
příkaz.
Bash read
Vestavěný #
read
je vestavěný příkaz bash, který přečte řádek ze standardního vstupu (nebo z deskriptoru souboru) a rozdělí řádek na slova. První slovo je přiřazeno křestnímu jménu, druhé druhému atd.
Obecná syntaxe read
vestavěný má následující podobu:
read [options] [name...]
Chcete-li ilustrovat, jak příkaz funguje, otevřete svůj terminál a zadejte read var1 var2
a stiskněte „Enter“. Příkaz počká, až uživatel zadá vstup. Napište dvě slova a stiskněte „Enter“.
read var1 var2
Hello, World!
Slova jsou přiřazena ke jménům, která jsou předána do read
příkaz jako argumenty. Použijte echo
nebo printf
pro ověření:
echo $var1
echo $var2
Hello, World!
Místo psaní na terminálu můžete standardní vstup předat read
pomocí jiných metod, jako je potrubí, here-string nebo heredoc:
echo "Hello, World!" | (read var1 var2; echo -e "$var1 \n$var2")
read
a echo
jsou uzavřeny v závorkách a spouštěny ve stejném podshell.Hello, World!
Zde je příklad s použitím řetězce here a printf
:
read -r var1 var2 <<< "Hello, World!"
printf "var1: %s \nvar2: %s\n" "$var1" "$var2"
Var1: Hello,
Var2: World!
Když není poskytnut žádný argument pro read
příkazu REPLY
je přiřazen celý řádek proměnná:
echo "Hello, world!" | (read; echo "$REPLY")
Hello, World!
Pokud je počet argumentů dodaných ke read
je větší než počet slov přečtených ze vstupu, zbývající slova jsou přiřazena k příjmení:
echo "Linux is awesome." | (read var1 var2; echo -e "Var1: $var1 \nVar2: $var2")
Var1: Linux
Var2: is awesome.
V opačném případě, pokud je počet argumentů menší než počet názvů, bude zbývajícím názvům přiřazena prázdná hodnota:
echo "Hello, World!" | (read var1 var2 var3; echo -e "Var1: $var1 \nVar2: $var2 \nVar3: $var3")
Var1: Hello,
Var2: World!
Var3:
Ve výchozím nastavení read
interpretuje zpětné lomítko jako znak escape, což může někdy způsobit neočekávané chování. Chcete-li zakázat escapování zpětného lomítka, vyvolejte příkaz s -r
možnost.
Níže je uveden příklad, jak read
funguje při vyvolání s a bez -r
možnost:
read <<< "Hello, \tWorld!"
printf %s "$REPLY"
Hello, World!
read -r <<< "Hello, \tWorld!"
printf %s "$REPLY"
Hello, \tWorld!
Obecně byste měli vždy používat read
pomocí -r
možnost.
Změna oddělovače #
Výchozí chování read
je rozdělit řádek na slova pomocí jedné nebo více mezer, tabulátorů a nového řádku jako oddělovačů. Chcete-li jako oddělovač použít jiný znak, přiřaďte jej k IFS
proměnná (Internal Field Separator).
echo "Linux:is:awesome." | (IFS=":" read -r var1 var2 var3; echo -e "$var1 \n$var2 \n$var3")
Linux
is
awesome.
Když IFS
je nastaven na jiný znak než mezera nebo tabulátor, slova jsou oddělena přesně jedním znakem:
echo "Linux::is:awesome." | \
(IFS=":" read -r var1 var2 var3 var4; echo -e "Var1: $var1 \nVar2: $var2 \nVar3: $var3 \nVar4: $var4")
Řádek je rozdělen na čtyři slova. Druhé slovo je prázdná hodnota představující segment mezi oddělovači. Je vytvořen, protože jsme použili dva oddělovací znaky vedle sebe (::
).
Var1: Linux
Var2:
Var3: is
Var4: awesome.
K rozdělení řádku můžete použít více než jeden oddělovač. Při zadávání více oddělovačů přiřaďte znaky k IFS
proměnná bez mezery mezi nimi.
Zde je příklad použití _
-
jako oddělovače:
echo 'Linux_is-awesome.' | (IFS="-_" read -r var1 var2 var3; echo -e "$var1 \n$var2 \n$var3")
Linux
is
awesome.
Řetězec výzvy #
Při psaní interaktivních bash skriptů můžete použít read
příkaz k získání uživatelského vstupu.
Chcete-li zadat řetězec výzvy, použijte -p
volba. Výzva se vytiskne před read
se provede a nezahrnuje nový řádek.
Zde je jednoduchý příklad:
read -r -p "Are you sure?"
Obecně byste použili read
příkaz uvnitř while
smyčka, která uživatele přinutí poskytnout jednu z očekávaných odpovědí.
Níže uvedený kód vyzve uživatele k restartování systému:
while true; do
read -r -p "Do you wish to reboot the system? (Y/N): " answer
case $answer in
[Yy]* ) reboot; break;;
[Nn]* ) exit;;
* ) echo "Please answer Y or N.";;
esac
done
Pokud skript shellu žádá uživatele o zadání citlivých informací, jako je heslo, použijte -s
možnost, která říká read
netisknout vstup na terminál:
read -r -s -p "Enter your password: "
Přiřadit slova k poli #
Chcete-li přiřadit slova k poli místo názvů proměnných, vyvolejte read
příkaz s -a
možnost:
read -r -a MY_ARR <<< "Linux is awesome."
for i in "${MY_ARR[@]}"; do
echo "$i"
done
Linux
is
awesome.
Když je zadáno pole i název proměnné, všechna slova jsou přiřazena k poli.
Závěr č.
read
příkaz se používá k rozdělení řádku vstupu na slova.