я получаю синтаксическую ошибку, когда я запускаю свой сценарий оболочки, ошибка в моем для каждого цикла и говорит, что неожиданный токен `;; ' - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь создать сценарий оболочки, который ищет отрывочные процессы, выводит список pid и имени процесса, спрашивает вас, хотите ли вы их убить, а затем, если вы говорите «да», проходит и убивает каждый процесс.,вот мой код до сих пор

#!/bin/bash

echo "CyPat Script by Valaire"
echo "  ~scetchy processes~"

$var  ps -aux | grep -e test -e idk | awk '{print $2 "  " $11}'

IFS=' '
read -a NAMES <<< "$var"
echo ${NAMES}

read -p "Kill all? " yn
case $yn in
        [Yy]* ) for name in $names
        do
            kill -9 $name; break;;
        [Nn]* ) echo no; break;;
        *) echo "y or n";;
esac

1 Ответ

2 голосов
/ 02 июля 2019
$var  ps -aux | grep -e test -e idk | awk '{print $2 "  " $11}'

- неправильный способ присвоения переменной с помощью вывода команды. Должно быть

var=$(ps -aux | grep -e test -e idk | awk '{print $2 "  " $11}')

Нет необходимости использовать grep при использовании awk, поскольку он может самостоятельно сопоставлять шаблоны.

var=$(ps -aux | awk '/test|idk/ {print $2 "  " $11}')

Вам необходимо добавить done в ваш цикл for и перейти к правильной переменной. Вы также не должны выходить из цикла.

for name in "${NAMES[@]}"; do
    kill -9 "$name"
done ;;

Но ваш массив $NAMES содержит чередующиеся PID и команды, вы должны только передавать PID в kill. Так что цикл должен быть:

for ((i=0; i < ${#NAMES[@]}; i+=2)); do
    kill -9 "${NAMES[i]}"
done

Вы не должны иметь break в случае [Nn]*). Вы можете использовать break только внутри цикла.

Исправленный скрипт должен быть:

#!/bin/bash

echo "CyPat Script by Valaire"
echo "  ~scetchy processes~"

var=$(ps -aux | awk '/test|idk/ {print $2 "  " $11}')

IFS=' '
NAMES=($var)
echo "${NAMES[@]}"

read -p "Kill all? " yn
case $yn in
        [Yy]* ) 
            for ((i=0; i < ${#NAMES[@]}; i+=2)); do
                kill -9 "${NAMES[i]}"
            done;;
        [Nn]* ) echo no;;
        *) echo "y or n";;
esac

Также не стоит давать имена переменных в верхнем регистре. Они обычно зарезервированы для переменных среды, и ваша переменная может конфликтовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...