Вы выполняете цикл от 1 до [количество аргументов], а затем проверяете, действительно ли каждое из этих чисел является каталогом. Было бы проще сделать что-нибудь вроде:
#!/bin/bash
for item in "$@"; do # iterate over the arguments themselves
if [[ ! -d "$item" ]]; then
echo "$item is not a directory" >> file.txt
else
DIRECTORY=$(ls -l $item | grep ^d | wc -l)
LINK=$(find $item -type l | wc -l)
FILE=$(ls -A $item | wc -l)
echo `date "+%H:%M:%S %d-%m-%y"` directory $item file count: $FILE link count: $LINK subdirectory count: $DIRECTORY >> file.txt
fi
done
Это происходит потому, что grep
и ps
запускаются параллельно, поэтому grep
процесс соответствует, потому что целевая строка test1.sh
появляется как его аргумент в ps
. Простой, но, вероятно, неоптимальный способ обойти это:
ps -ef | grep "test1.sh" | grep -v "grep"
Второй конвейер принимает вывод первого и исключает строки, содержащие совпадение со строкой «grep».
Вы можете просто проигнорировать grep по одному из следующих: -
ps -ef | grep test1.sh | grep -v grep
else: -
ps -ef | grep "[t]est1.sh"
Второй вид спускается, и это экономит много времени.
Если вы просто хотите посмотреть, работает ли он, а не выводите ps
по каналу grep
, вы можете используйте pgrep
. Это будет выводить только PID процесса и будет намного более эффективным. Я использую флаг -x
, чтобы он точно соответствовал имени test1.sh
pgrep -x test1.sh
876
. Если вы хотите видеть имя команды, вы также можете использовать -l
] флаг.
pgrep -xl test1.sh
876 test1.sh
А если вы хотите выполнить частичное совпадение, вы можете просто удалить -x
pgrep -l test
876 test1.sh
877 test2.sh
888 test123.sh
8745 test.bin