Ошибка при использовании ‘if’ со счетчиком в Bash

Что не так со следующим? Я получаю ошибку [: too many arguments .

 if [ 'wc -l pid.txt | awk '{print $1}'' -ge "1" ] then for line in $(cat pid.txt) do kill $line done else rm pid.txt fi 

Улучшено в дальнейшем благодаря Кусалананде.

  • Тестирование содержимого файла не требуется, поскольку цикл while read while не будет выполняться для пустого файла.
  • Затем вы можете просто использовать [ -s pid.txt ] || rm pid.txt [ -s pid.txt ] || rm pid.txt для удаления файла pid. Однако у вас действительно есть причина сохранить файл после обработки? Вероятно, вы захотите удалить его независимо.

 while read -r line do kill "$line" done < pid.txt [ -s pid.txt ] || rm pid.txt 

Цикл while read while используется вместо for $(cat ...) . Не читайте строки с for .

Параметр -r указывает «не разрешать обратной косой черте экранировать любые символы», что на самом деле не должно быть проблемой в файле pids, но рекомендуется всегда устанавливать, если для этого нет особой причины.