首页 > 解决方案 > 当我运行我的 shell 脚本时,我得到一个语法错误,错误在我的每个循环中,并说 unspected token `;;'

问题描述

我正在尝试制作一个 shell 脚本来搜索粗略的进程,打印出进程的 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

标签: bashshell

解决方案


$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}')

您需要添加donefor循环中,并循环正确的变量。你也不应该跳出循环。

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

给变量全大写名称也不是一个好主意。这些通常是为环境变量保留的,您的变量可能会发生冲突。


推荐阅读