Краткое резюме: двойные кавычки ваших переменных ссылок.И используйте shellcheck.net .
Длинное объяснение: Когда вы используете переменную без двойных кавычек (например, echo ${str}
), оболочка пытается разделить ее значение на слова, иразверните все, что выглядит как подстановочное выражение, в список подходящих файлов.В случае [0.0.0.0]
квадратные скобки превращают его в подстановочное выражение, которое будет соответствовать символу «0» или «.»(эквивалентно [0.]
).Если у вас есть файл с именем «0», он будет расширен до этой строки.При отсутствии соответствующих файлов он обычно остается нерасширенным, но с установленным nullglob
он расширяется до ... null.
Отключение nullglob
решает проблему, если не найдено подходящих файлов, ноне совсем правильный способ сделать это.Я помню (но не могу найти прямо сейчас) вопрос, который у нас был о сценарии, который вышел из строя на одном конкретном компьютере, и оказалось, что причина в том, что на одном компьютере был файл, который соответствовал выражению в скобках в значении переменной без кавычек.
Правильное решение - поместить двойные кавычки вокруг ссылки на переменную.Это говорит оболочке пропустить разделение слов и расширение по шаблону.Вот интерактивный пример:
$ str='[0.0.0.0]' # Quotes aren't actually needed here, but they don't hurt
$ echo $str # This works without nullglob or a matching file
[0.0.0.0]
$ shopt -s nullglob
$ echo $str # This fails because of nullglob
$ shopt -u nullglob
$ touch 0
$ echo $str # This fails because of a matching file
0
$ echo "$str" # This just works, no matter whether file(s) match and/or nullglob is set
[0.0.0.0]
Итак, в вашем скрипте просто измените последнюю строку на:
echo "${str}"
Обратите внимание, что двойные кавычки не требуются ни в case $opt in
, ни в str=$OPTARG
потому что переменные в этих конкретных контекстах не подвержены разбиению по словам или расширению по шаблону.Но IMO, отслеживание контекстов, в которых безопасно оставлять двойные кавычки, доставляет больше хлопот, чем стоит, и вам следует просто заключить их в двойные кавычки.
BTW, shellcheck.net хорошо замечает типичные ошибки, подобные этой;Я рекомендую пропустить ваши сценарии через него, так как это, вероятно, не единственное место, где у вас есть эта проблема.