/bin/sh
в общем случае не поддерживает массивы, кроме списка позиционных параметров.
Давайте использовать это:
#/bin/sh
pos=$1
if [ "$pos" -lt 1 ] || [ "$pos" -gt 12 ]; then
printf 'No such month: %s\n' "$pos" >&2
exit 1
fi
set -- 31 28 31 30 31 30 31 31 30 31 30 31
shift "$(( pos - 1 ))"
printf '%s\n' "$1"
Сначала выбирается число из командной строкии помещает это в pos
.Затем он устанавливает позиционные параметры, которые вы имели в вашем массиве.Сдвигая pos - 1
элементов из этого массива, мы получаем искомый номер в $1
.
Это будет работать, даже если список содержит строки с пробелами в них, например, в
#/bin/sh
pos=$1
if [ "$pos" -lt 1 ] || [ "$pos" -gt 12 ]; then
printf 'No such month: %s\n' "$pos" >&2
exit 1
fi
set -- "thirty one" "twenty eight" "thirty one" etc.
shift "$(( pos - 1 ))"
printf '%s\n' "$1"
Другой способ решить эту проблему с помощью /bin/sh
- с помощью оператора case
:
case $1 in
2)
echo 28 ;;
4|6|9|11)
echo 30 ;;
1|3|5|7|8|10|12)
echo 31 ;;
*)
print 'No such month: %s\n' "$1" >&2
exit 1
esac