水平显示多个bash输出

时间:2016-01-24 23:08:54

标签: linux bash .bash-profile

我的机器上运行了4个重要的服务,我想一直看到它们。我有这个简单的bash脚本作为bash配置文件运行。

echo
PROC="nginx mysql php-fpm pptpd"
for p in $PROC
do
  ps cax | grep $p > /dev/null

  if [ $? -eq 0 ]; then
  echo -e "\e[92m$p running\e[0m"
  else
    echo -e "\e[101m$p IS NOT RUNNING \e[0m"
  fi

done
echo

此脚本的输出是:

nginx running
mysql running
php-fpm running
pptpd running

我怎么能这样做?

nginx running - mysql running - php-fpm running - pptpd running

2 个答案:

答案 0 :(得分:1)

使用printf或添加-n标志以回显。

不带ProcTools的POSIX兼容重构

#!/bin/sh

showstatus() {
  echo
  while [ "$1" ]; do
    if ps cax | grep -qF "$1"; then
      msg='\e[92m%s running\e[0m'
    else
      msg='\e[101m%s IS NOT RUNNING \e[0m'
    fi
    printf "$msg" "$1"
    shift
    [ "$1" ] && printf ' - '
  done
  echo
}
showstatus nginx mysql php-fpm pptpd

使用ProcTools的POSIX兼容重构

#!/bin/sh

showstatus() {
  echo
  while [ "$1" ]; do
    if pkill -0 "$1"; then
      msg='\e[92m%s running\e[0m'
    else
      msg='\e[101m%s IS NOT RUNNING \e[0m'
    fi
    printf "$msg" "$1"
    shift
    [ "$1" ] && printf ' - '
  done
  echo
}
showstatus nginx mysql php-fpm pptpd

答案 1 :(得分:1)

首先将状态行构建到数组中,然后打印数组:

status=()
for p in $PROC
do
  if ps cax | grep -q $p; then
    status+=( " \e[92m$p running\e[0m " )
  else
    status+=( " \e[101m$p IS NOT RUNNING \e[0m " )
  fi
done
(IFS=-; echo -e "${status[*]}")

${status[*]}扩展到由IFS的第一个字符连接的数组中的每个元素,我之前设置为-。请注意,我使用了子shell (IFS=-; echo ...),因此更改IFS不会影响脚本的其余部分。

其他说明:

ps cax | grep $p > /dev/null
if [ $? -eq 0 ]; then

可以合并到:

if ps cax | grep -q $p; then

更简洁,更易读。您也可以考虑使用pgrep