Fråga efter bekräftelse på åtgärd i POSIX skalskript
#!/bin/bash i all ära, men vad om #!/bin/sh - den minsta gemensamma nämnaren för POSIX-compliance?
Detta inlägg visar hur ett skript tar emot hemlig inmatning och sparar i en variabel (t ex lösenord, tokens) med maximal portabilitet.
Skriptkod
Nedan visar exempel på att bekräfta en önskad åtgärd. Vid tryck på Enter sparas den inmatade texten i variabeln ans. För att få till felhantering behövs en loop som inte låter användaren fortsätta förrän ett giltigt värde matats in.
Exempel 1 - Bekräftelse med default, ingen felhantering:
#!/bin/sh
printf "Är du säker? [y/N] "
read -r i
case "$i" in
[yY])
ans="y"
;;
""|[nN])
ans="n"
;;
esac
printf "Du svarade: %s\n" "$ans"
Exempel 2 - Bekräftelse med default, med felhantering:
#!/bin/sh
while [ -z "$ans" ]; do
printf "Är du säker? [y/N] "
read -r i
case "$i" in
[yY])
ans="y"
break
;;
""|[nN])
ans="n"
break
;;
*)
printf "Felaktigt svar! Ange \"y\" eller \"n\".\n"
;;
esac
done;
printf "Du svarade: %s\n" "$ans"
Exempel 3 - Bekräftelse utan default, med felhantering:
#!/bin/sh
while [ -z "$ans" ]; do
printf "Är du säker? [y/n] "
read -r i
case "$i" in
[yY])
ans="y"
break
;;
[nN])
ans="n"
break
;;
*)
printf "Felaktigt svar! Ange \"y\" eller \"n\".\n"
;;
esac
done;
printf "Du svarade: %s\n" "$ans"
Verifiera: är detta POSIX-kompatibelt?
Detta kontrolleras enklast med programmet shellcheck.
shellcheck -s sh confirmation.sh
Detta är ett inlägg i en serie om att skripta Unixliknande system med maximal portabilitet. Förgående inlägg i serien: Inmatning av data i POSIX skalskript.