Во время цикла в скрипте оболочки

Вы можете использовать Samba для совместного использования локальной файловой системы без учета регистра... в этой статье есть некоторые подробности.

0
05.10.2018, 12:54
5 ответов

В цикле while вам нужно уменьшить значение переменной count.

count=10
while [ $count -ne 0 ]; do
    echo "Count is $count"
    ((count--))
done

Для реальной арифметики существует несколько способов сделать это, например:

  • ((count--))
  • ((count-=1))
  • ((count=count-1))
  • count=$((count - 1))

Дополнительные сведения о конструкциях с двойными скобками см. в :https://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/dblparens.html

.

Вы также можете использоватьlet:

  • let "count--"
  • let "count-=1"
  • let "count=count-1"

Для получения дополнительной информации о letсм.:http://wiki.bash-hackers.org/commands/builtin/let


Изменить:Примечание о совместимых с POSIX оболочках, которые не имеют таких же причудливых функций, как bash.

Оболочки Posix могут использовать синтаксис $(( <expression> )). Итак, если у вас был тот же цикл, что и выше, и вы хотели убедиться, что он будет работать в оболочке, такой как ksh, или официально переносимой оболочке, такой как CAE Issue 4 (XPG4 )'ssh:

  • count=$((count - 1))

Использование этого синтаксиса сделает ваш скрипт более переносимым, чем использование специфичного для bash синтаксиса, если это важно для вас.

2
28.01.2020, 02:14

заменить

count="..."

с

count=`...`
-1
28.01.2020, 02:14
count="/usr/bin/ps -aef|...|wc -l"

Не храните команды в переменных, они для этого не предназначены и использование сохраненной команды затруднено. Если вы хотите где-то сохранить команду, используйте вместо нее функцию:

count_procs() {
    /usr/bin/ps -aef|...|wc -l
}

Функцию можно использовать как любую другую команду.

Код, который вы показали, сравнивает значение этой строки в countс нулем как целым числом. Bash [будет жаловаться на числовое значение, отличное от -.

Указанная вами ошибка возникает из-за такой команды, как["$count" -eq 0 ](без пробела между [и $count), поскольку в этом случае содержимое countобъединяется с [для формирования первого слова командной строки, имя запускаемой команды. Хотя это было бы глупо, вполне возможно иметь путь, содержащий скобки, символы вертикальной черты и пробелы.

Теперь, предполагая, что вы действительно хотите запустить команду и зафиксировать ее вывод для сравнения с нулем, вам нужно будет использовать подстановку команд$(...):

result=$(ps... |wc -l)            # save the output of the command to `result`

или

[ "$(ps... | wc -l)" -eq 0 ]... # use the command output directly in a test

Предполагая, что вы хотите считать процессы каждый раз, когда выполняется цикл, вам придется запустите команду в теле цикла. Так, например.

while [ "$(ps... | wc -l)" -eq 0 ]; do
   ...
done

или с функцией

count_procs() {
    /usr/bin/ps -aef|...|wc -l
}
while [ "$(count_procs)" -eq 0 ]; do
   ...
done  

Простой подсчет процессов один раз перед циклом сделает условие постоянным, и цикл будет повторяться бесконечно или не будет повторяться вообще.

3
28.01.2020, 02:14

В дополнение к путанице, связанной с цитированием подстановки команд, сообщение об ошибке указывает, что у вас действительно есть while ["$count" -ne 0]без необходимого пробела вокруг квадратных скобок. Имейте в виду, что часть после «пока» на самом деле является командой , и цикл заканчивается, когда команда выходит с не -нулевым статусом (ref https://www.gnu.org/software/bash/manual/bashref.html#Looping-Constructs).

Из-за отсутствия пробела bash видит

while ["/usr/bin/ps -aef|/usr/bin/egrep 'catalina|java|wrapper-linux-x86-64'|/usr/bin/grep -v 'catalina|java|wrapper-linux-x86-64'|wc -l" -ne 0]

и пытается выполнить команду ["/usr/bin/ps -aef|...|wc -l", которая явно не найдена

Важно помнить, что [на самом деле является командой , и поэтому пробел после нее необходим для отделения имени команды от ее первого аргумента. (по той же причине, по которой вы пишете ls -l, а неls-l). Также команда [требует, чтобы ]был ее последним аргументом, поэтому ]также требует разделения пробелами.

В командной строке bash введите help [и help test(, а такжеhelp [[)

1
28.01.2020, 02:14

Проще:

while pkill -f 'catalina|java|wrapper-linux-x86-64'; do 
  sleep 10
done

По-прежнему небезопасно убивать процессы на основании их списка аргументов.

1
28.01.2020, 02:14

Теги

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