Bash从一个数组中获取具有索引值的数组成员

时间:2012-04-22 16:28:54

标签: arrays bash

我正在使用bash中的多个对话框屏幕编写脚本。脚本的一个功能应该是杀死特定进程。我将所有PID值加载到一个名为pid的数组中:

pid = ('1234' '1233' '1232' '1231' '1230')

然后我向用户显示一个包含进程列表的对话框清单。 在他们选择其中一些对话框后,返回清单条目编号,例如0,2,4。

我的初步计划是将所选条目存储在第二个数组中,然后使用它从第一个数组中获取特定的PID,但到目前为止,我尝试过的任何工作都没有,在这种情况下将是:1234,1232 ,1230。所以我可以杀死那些特定的过程。

有没有人有更好的解决方案?我希望根据用户在对话框清单中所做的选择,最简单的方法来终止进程。

这是有问题的功能:

stop_tunnel() {

local tunnels
local pid
declare -a tunnels
declare -a pid

#this is executed on a remote system in the real script
ps aux | grep -w ssh > $_temp

awk -F "ssh" '{print "ssh" $2}' $_temp > $_temp1
awk '{print $2}' $_temp > $_temp2

IFS='
'
tunnels=( $( < $_temp1 ) )
pid=( $( < $_temp2 ) )

dialog --checklist "Select tunnel to stop:" 10 72 0 \
                   0 "${tunnels[0]}" off \
                   1 "${tunnels[1]}" off \
                   2 "${tunnels[2]}" off \
                   3 "${tunnels[3]}" off \
                   4 "${tunnels[4]}" off \
                   2>$_temp

nr=$( < $_temp )

dialog --title " Tunnel stop " --msgbox "\nYou stopped these tunnels: ${nr[@]}" 6 44

}

nr数组包含用户选择。我想用它来将特定成员从pid数组中拉出来。

1 个答案:

答案 0 :(得分:2)

选择可能就是您所需要的:

select p in ${pid[@]} ; do   echo "kill" $p && break; done

请注意,作业周围的空白不起作用:

# wrong:
pid = ('1234' '1233' '1232' '1231' '1230')
# right:
pid=('1234' '1233' '1232' '1231' '1230')

允许按顺序终止多个进程:

select p in ${pid[@]} ; do
  if [[ -n $p ]]
     then echo "kill" $p
     else break
  fi
done
1) 1234
2) 1233
3) 1232
4) 1231
5) 1230
#? 3
kill 1232
#? 4
kill 1231
#? 6

echo 当然只是用于测试。

对用户的提示,无效索引将终止进程终止似乎是合适的。第二种方法可能是明确的终止案例:

pid=('1234' '1233' '1232' '1231' '1230' 'terminate')

你将处理休息。

如果你只想迭代选择,那么:

sel=(0 2 4) 
for n in ${sel[@]} ; do echo kill ${pid[$n]}; done  

更新您的评论:

我没有安装对话框,但我猜zenity类似。在那里你捕获列表选择的输出:

selection=($(zenity --list --text "kill something" --multiple --column "kill" --separator " " --checklist --column ps TRUE foo FALSE bar FALSE baz TRUE fozboa))