У меня есть свои программы, посылают мне электронные письма или звуковой сигнал консоль, когда они закончены. Я использую && символ, который говорит консоли ожидать предыдущей команды для окончания, и я заканчиваю все это другим и получить контроль консоли назад.
Таким образом, Ваш пример был бы похож на это:
склонный - получают-b источник packagename && сон 10 && слабых соперников "Завершенное задание компиляции". И
Я добавляю сон 10 в придачу. Обратите внимание, что я не знаю слабый синтаксис.
Кроме того, не используя слабого соперника, Вам могло бы понравиться использовать mailx, чтобы послать Вам электронные письма или сообщения txt, или повторить-a "\a" для подачи звукового сигнала консоли вместо этого.
Это потому, что вы каждый раз порождаете подоболочку:
if ([ $remainder == 0 ] && [ $is_prime == true ]); then
Просто удалите скобки
if [ $remainder == 0 ] && [ $is_prime == true ]; then
Если вы хотите сгруппировать команды, есть синтаксис, чтобы сделать это в текущей оболочке:
if { [ $remainder == 0 ] && [ $is_prime == true ]; }; then
(требуется точка с запятой, см. в руководстве )
Обратите внимание, что [ is_prime ]
не то же самое, что [ $is_prime == true ]
: можно написать, что это просто $is_prime
(без скобок), которая вызовет встроенную команду bash true
или false
.
[ is_prime ]
- это тест с одним аргументом, строка "is_prime" -- когда [
дается один аргумент, результат успешен, если аргумент не пустой, а строка литерала всегда не пуста, следовательно, всегда "true".
Для удобочитаемости я бы изменил очень длинную строку
[ $is_prime == true ] && echo "${number_under_test} is prime!" || echo "${number_under_test} is NOT prime (factors= $factors)" [ $is_prime == true ] && largest_prime=$number_under_test
на
if [ $is_prime == true ]; then
echo "${number_under_test} is prime!"
else
echo "${number_under_test} is NOT prime (factors= $factors)"
# removed extraneous [ $is_prime == true ] test that you probably
# didn't notice off the edge of the screen
largest_prime=$number_under_test
fi
Не стоит недооценивать пробелы для большей ясности.
Я думаю, что вы работаете слишком сложно с этой функцией вашего. Рассмотрим:
unset num div lprime; set -- "$((lprime=(num=(div=1))))"
while [ "$(( num += ! ( div *= ( div <= num ) ) ))" -eq \
"$(( num *= ( div += 1 ) <= 101 ))" ] && {
set "$(( ! ( num % div ) * div ))" "$@"
shift "$(( ! $1 + ( $1 == 1 ) * $# ))"
}; do [ "$div" -gt "$num" ] && echo "$*"
done
арифметика оболочки довольно способна оценивать целочисленные условия самостоятельно. Редко требуется слишком много испытаний и / или внешних заданий. Этот , в то время как
в то время как петля дублирует ваши вложенные петли справедливо хорошо:
Это не печатает столько, конечно, я не писал все так, но, например, устанавливая потолок до 16 чем 101, как написано выше и ...
2
3
4 2
5
6 3 2
7
8 4 2
9 3
10 5 2
11
12 6 4 3 2
13
14 7 2
15 5 3
Это определенно делает работу. И это требует очень мало для приближения вашего выхода:
...
do [ "$div" -eq "$num" ] && shift &&
printf "$num ${1+!}= prime.${1+\t%s\t%s}\n" \
"factors= $*" \
"lprime=$(( lprime = $# ? lprime : num ))"
done
просто делает это, а не в Echo
и ...
1 = prime.
2 = prime.
3 = prime.
4 != prime. factors= 2 lprime=3
5 = prime.
6 != prime. factors= 3 2 lprime=5
7 = prime.
8 != prime. factors= 4 2 lprime=7
9 != prime. factors= 3 lprime=7
10 != prime. factors= 5 2 lprime=7
11 = prime.
12 != prime. factors= 6 4 3 2 lprime=11
13 = prime.
14 != prime. factors= 7 2 lprime=13
15 != prime. factors= 5 3 lprime=13
это работает в BusyBox
. Это очень портативный, быстрый и простой в использовании.
Ваша проблема поддона будет происходить в большинстве снарядов, но это, по далеко , наиболее острым в Bash
bash . Я чередовался между Drey
( [ "$div" -gt "$num" ] ) && ...
... И то, как я написал его выше в нескольких снарядах для потолка 101 и Dash
сделал это без подполей в 0,017 секунды и с подполюбом за 1,8 секунды. Bitebox
.149 и 2, ZSH 0,49 и 4, Bash
.35 и 6, а ksh93
в 0,49 и .160. ksh93
не вило для подполей, поскольку другие оболочки должны. Поэтому, возможно, проблема не так много подполей, поскольку это Shell .