целое выражение ожидало удар

Имя файла Shell globbing и регулярные выражения используют некоторые из тех же символов, и у них есть подобные цели, но Вы правы, они не совместимы. Имя файла globbing является намного менее мощной системой.

В имени файла globbing:

  • * означает "нуль или больше символов"

  • ? означает "любой отдельный символ"

Но в regexes, необходимо использовать .* означать "нуль или больше символов", и . означает "любой отдельный символ". A ? средства что-то очень отличающееся в regexes: нуль или один экземпляр предыдущего элемента РЕ.

Квадратные скобки ([]) кажись, работать то же в обеих системах в системе, я ввожу это на для простых случаев, по крайней мере. Это включает вещи как классы символов POSIX (например. [:alpha:]). Тем не менее, если Вам нужны Ваши команды для работы над многими различными системными типами, я рекомендую против использования чего-либо вне элементарных вещей как списки символов (например. [abeq]) и возможно диапазоны символов (например. [a-c]).

Эти различия означают, что эти две системы являются только непосредственно взаимозаменяемыми для простых случаев. При необходимости в соответствии regex имен файлов необходимо сделать это иначе. find -regex одна опция. (Заметьте, что существует также find -name, между прочим, который использует синтаксис шарика.)

4
27.10.2013, 05:08
2 ответа

Необходимо использовать a $ развернуть переменную в ударе, если это не в (( )). Вы сравниваете литеральную строку "цифра" с номером 0. Используйте одно из следующего:

while [ "$num" -ge 0 ] # POSIX
while (( num >= 0 )); # bash
3
27.01.2020, 20:56

Несколько исправлений.

#!/bin/sh
echo "What do you want to say?"
read phrase

echo "How many times?"
read num

while [ $num -gt 0 ];
do
     echo $phrase
     let num='num - 1'
done

Пример

$ ./cmd.bash 
What do you want to say?
hi
How many times?
4
hi
hi
hi
hi

Можно сделать перерасчет $num немного более оптимизированный и легче читать с этой нотацией.

Измените эту строку:

     let num='num - 1'

с этим:

     ( num-- ))

Это становится сбивающим с толку относительно того, когда использовать или не использовать $ нотация для переменных, обычно Вы будете хотеть консультироваться со страницей справочника для bash и test при выполнении этого вида работы. Это изменение склонно, если Вы используете bash и не просто собственный компонент sh.

Подробнее

  1. Необходимо использовать переменную форму $num при выполнении граничной проверки в while циклы управляют разделом.
  2. Использовать let вместо expr.
  3. Направляющееся в цикл включает эти 0 шагов с -ge который даст Вам еще 1, чем, что Вы хотите.

Пример

С while использование проверки принадлежности к диапазону циклов -gt Вы получаете этот результат:

$ ./cmd.bash 
What do you want to say?
hi
How many times?
2
hi
1
hi
0

Если Вы используете Ваш -ge Вы получите это поведение:

$ ./cmd.bash 
What do you want to say?
hi
How many times?
2
hi
1
hi
0
hi
-1
1
27.01.2020, 20:56
  • 1
    Еще лучше, чем let: (( num++ )) –  jordanm 27.10.2013, 05:24
  • 2
    @jordanm - благодарит, я изменю его, я не делаю большого количества математики в оболочке больше, обычно использую Perl для этого типа 8-) –  slm♦ 27.10.2013, 05:25
  • 3
    материала, я не изменил бы его, просто комментарий сделает. OP отметил удар вопроса, но имеет sh в их хижине. Альтернативная методика, которую я представил, не будет работать в POSIX sh. –  jordanm 27.10.2013, 05:26
  • 4
    @jordanm - Я включил его в ответ, но оставил оригинал неповрежденным также. –  slm♦ 27.10.2013, 05:28

Теги

Похожие вопросы