Имя файла Shell globbing и регулярные выражения используют некоторые из тех же символов, и у них есть подобные цели, но Вы правы, они не совместимы. Имя файла globbing является намного менее мощной системой.
В имени файла globbing:
*
означает "нуль или больше символов"
?
означает "любой отдельный символ"
Но в regexes, необходимо использовать .*
означать "нуль или больше символов", и .
означает "любой отдельный символ". A ?
средства что-то очень отличающееся в regexes: нуль или один экземпляр предыдущего элемента РЕ.
Квадратные скобки ([]
) кажись, работать то же в обеих системах в системе, я ввожу это на для простых случаев, по крайней мере. Это включает вещи как классы символов POSIX (например. [:alpha:]
). Тем не менее, если Вам нужны Ваши команды для работы над многими различными системными типами, я рекомендую против использования чего-либо вне элементарных вещей как списки символов (например. [abeq]
) и возможно диапазоны символов (например. [a-c]
).
Эти различия означают, что эти две системы являются только непосредственно взаимозаменяемыми для простых случаев. При необходимости в соответствии regex имен файлов необходимо сделать это иначе. find -regex
одна опция. (Заметьте, что существует также find -name
, между прочим, который использует синтаксис шарика.)
Необходимо использовать a $
развернуть переменную в ударе, если это не в (( ))
. Вы сравниваете литеральную строку "цифра" с номером 0. Используйте одно из следующего:
while [ "$num" -ge 0 ] # POSIX
while (( num >= 0 )); # bash
Несколько исправлений.
#!/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
.
$num
при выполнении граничной проверки в while
циклы управляют разделом.let
вместо expr
.-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
sh
в их хижине. Альтернативная методика, которую я представил, не будет работать в POSIX sh.
– jordanm
27.10.2013, 05:26