/ / A skrypt powłoki „błąd getopts” - bash, shell, unix, getopts

Skrypt powłoki "błąd getopts" - bash, shell, unix, getopts

Mam ten kod:

#!/bin/bash
if [ $# -lt 2 ]; then
echo "usage: $0 <-lu> <string>"
exit 1
fi
while getopts "lu" OPT
do
case $OPT in
u) casechange=0;;
l) casechange=1;;
*) echo "usage: -u<upper> || -l<lower> <string>";
exit 1;;
esac
done
shift $(( $optind -1 ))
if [ $casechange -eq 0 ]; then
tr "[A-Z]" "[a-z]" <$string
elif [ $casechange -eq 1 ]; then
tr "[a-z]" "[A-Z]" <$string
else
echo "fatal error"
exit 1
fi

Dostaję dwa błędy:

  • line 15: shift -1: shift count out of range
  • line 19: $string: ambiguous redirect

Co ja robię źle? Jak to naprawić?

Odpowiedzi:

0 dla odpowiedzi № 1

OPTIND musi być wielkimi literami. Domyślnie wielkość liter jest rozróżniana. Sprawia, że $optind pusta i skutecznie próbujesz przesunąć się o -1.

Ponadto, po przetworzeniu opcji, musisz zrobić coś z argumentami nonoption: string="$1"

i wtedy tr "[A-Z]" "[a-z]" <<<"$string" dla twoich przekierowań ze zmiennej. Na koniec, twoje smutne wyjście ścieżki powinno być stderr (>&2).

Wszystkie połączone (+ kilka drobnych ulepszeń):

#!/bin/bash
if [[ $# -lt 2 ]]; then
echo "usage: $0 <-lu> <string>" >&2
exit 1
fi
while getopts "lu" OPT
do
case $OPT in
u) casechange=0;;
l) casechange=1;;
*) echo "usage: -u<upper> || -l<lower> <string>" >&2;
exit 1;;
esac
done
shift $(( $OPTIND -1 ))
string="$1"
if [[ "$casechange" -eq 0 ]]; then
tr "A-Z" "a-z" <<<"$string"
elif [[ "$casechange" -eq 1 ]]; then
tr "a-z" "A-Z" <<<"$string"
else
echo "fatal error" >&2
exit 1
fi