bash - 当我运行我的 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
解决方案
$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
给变量全大写名称也不是一个好主意。这些通常是为环境变量保留的,您的变量可能会发生冲突。
推荐阅读
- json - 如何将特殊格式的数据导入 Elasticsearch?
- regex - 如何使用 realline() 使用正则表达式在文件中查找匹配项并将它们打印到控制台
- reactjs - REact js noob here,如何在循环遍历带有键的数组时更改状态对象值
- ios - Swift 如何从实时网站中抓取前 500 或 1000 个顶级网站?
- amazon-web-services - 预配置 EC2 上的 AWS 系统设计
- laravel - 如何在 Laravel 中使用一个用户模型创建单独的登录视图和重定向
- c - 使用字符串和固定大小的动态内存分配
- symfony - 不使用自定义子资源路径时关系实体字段上的安全投票者
- c++ - 如何在 MFC 中从弹出所有者绘制 ListBox 中获取 selchange msg
- markdown - Doxygen 中的 Markdown 文件,两个谜题