带循环的Bash数组

时间:2009-11-22 03:08:18

标签: shell

我编写了一个Bash脚本,它试图找到一个进程并在它停止时运行该进程。 这是剧本。

#!/bin/bash
process=thin
path=/home/deepak/abc/
initiate=thin start -d

process_id=`ps -ef | pgrep $process | wc -m`

if [ "$process_id" -gt "0" ]; then
  echo "The process process is running!!"
else     
  cd $path    
  $initiate
  echo "Oops the process has stopped"    
fi

这很好用,我想使用数组,以便我可以形成一个循环使用此脚本来检查多个进程。所以我像这样修改了我的脚本

#!/bin/bash
process[1]=thin
path[1]=/home/deepak/abc/
initiate[1]=thin start -d

process_id=`ps -ef | pgrep $process[1] | wc -m`

if [ "$process_id" -gt "0" ]; then
  echo "Hurray the process ${process[1]} is running!!"
else
  cd ${path[1]}
  ${initiate[1]}
  echo "Oops the process has stopped"
  echo "Continue your coffee, the process has been stated again! ;)"
fi

如果我运行此脚本,我会收到此错误。

DontWorry.sh: 2: process[1]=thin: not found
DontWorry.sh: 3: path[1]=/home/deepak/abc/: not found
DontWorry.sh: 4: initiate[1]=thin start -d: not found 

我谷歌搜索找到任何解决方案,大多数人坚持使用“#!/ bin / bash”而不是“#!/ bin / sh”。我试过了两个但没什么用。我错过了什么?

3 个答案:

答案 0 :(得分:0)

我实际上并不知道你可以像这样设置数组。我一直用:

pax> initiate=("thin start -d" "xx")
pax> echo ${initiate[0]}
thin start -d
pax> echo ${initiate[1]}
xx

您可能需要字符串周围的引号。在我的bash(4.0.33),

initiate[1]=thin start -d

被解释为“set initiate [1] = thin然后run start -d”,因为你可以:

fspec=/etc/passwd ls -al ${fspec}

为单个命令设置环境变量。您正在运行什么版本的bash(使用bash --version)?

更新

Deepak,我已经让这个脚本在与bash相同的版本下运行了。请参阅以下成绩单:

pax> bash --version
GNU bash, version 3.2.48(21)-release (i686-pc-cygwin)
Copyright (C) 2007 Free Software Foundation, Inc.

pax> cat qq.sh
#!/bin/bash
process=(sleep)
path=(/)
initiate=("sleep 3600")

process_id=`ps -ef | pgrep ${process[0]} | wc -m`

if [ "$process_id" -gt "0" ]; then
    echo "Hurray the process ${process[0]} is running!!"
else
    cd ${path[0]}
    ${initiate[0]} &
    echo "Oops the process has stopped"
    echo "Continue your coffee, the process has been stated again! ;)"
fi

pax> ./qq.sh
Oops the process has stopped
Continue your coffee, the process has been stated again! ;)

pax> ./qq.sh
Hurray the process sleep is running!!

pax> ps -ef
UID     PID    PPID TTY     STIME COMMAND
pax     112       1 con  10:16:24 /usr/bin/bash
pax    4568       1 con  10:23:07 /usr/bin/sleep
pax    5924     112 con  10:23:18 /usr/bin/ps

您可以在自己的环境中尝试修改后的脚本,看看它是如何进行的吗?

答案 1 :(得分:0)

Deepak Prasanna,您可能想重新考虑监控过程的方式。

lhunath gives reasons没有使用ps来监控/重启进程,还有 一个简单的脚本包装器,以更清洁的方式实现目标。

答案 2 :(得分:0)

也许是这样的:

#!/usr/bin/perl -w
use strict;

my @processes = ({process=>'thin',
                  path=>'/home/deepak/abc/',
                  initiate=>'thin start -d'
                 },
                 # more records go here...
                );

for $p (@processes) {
   my $cmd = 'ps -ef | pgrep ' . $p->{process} . ' | wc -m';
   if (`$cmd` > 0) {
     print "The process process is running!!\n";
   } else {
     exec('cd ' . $p->{path} . '; ' .  
          $p->{$initiate}. '; '.
          'echo Oops the process has stopped'); 
   }
}