Вы можете использовать Samba для совместного использования локальной файловой системы без учета регистра... в этой статье есть некоторые подробности.
В цикле 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 синтаксиса, если это важно для вас.
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
Простой подсчет процессов один раз перед циклом сделает условие постоянным, и цикл будет повторяться бесконечно или не будет повторяться вообще.
В дополнение к путанице, связанной с цитированием подстановки команд, сообщение об ошибке указывает, что у вас действительно есть 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 [[
)
Проще:
while pkill -f 'catalina|java|wrapper-linux-x86-64'; do
sleep 10
done
По-прежнему небезопасно убивать процессы на основании их списка аргументов.