5

我在 linux bash 中编写了一个程序,以下是启动/停止该程序的方法:

start_program
stop_program
restart_program.

我已经在 /usr/bin 中复制了上面的脚本,所以这些脚本作为命令工作。但我希望我只输入程序名称而不是上面的命令,然后将操作作为参数传递。例如,如果我想启动程序,那么我应该在命令提示符下写:

ProgramName start

如果我想卸载然后

ProgramName uninstall

如果重启

ProgramName restart

那么我怎样才能让它只写程序名称然后将动作作为参数传递并按回车键来做那件事。

4

3 回答 3

13

一种常见的方法是使用 case 语句:

case "$1" in
  start)
    # Your Start Code
    ;;
  stop)
    # Your Stop Code
    ;;
  restart)
    # Your Restart Code
    ;;
  *)
    echo "Usage: $0 {start|stop|restart}" >&2
    exit 1
    ;;
esac

如果你restart只是stopthen start,你可以这样做:

start() {
  # Your Start Code
}

stop() {
  # Your Stop Code
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  *)
    echo "Usage: $0 {start|stop|restart}" >&2
    exit 1
    ;;
esac
于 2012-05-04T11:20:26.323 回答
2

Sionide21 是对的。

这里有一篇很棒的小文章:

http://wiki.bash-hackers.org/scripting/posparams

于 2012-05-04T11:27:06.913 回答
0

这是 case 语句的替代方法。

使用bash/shell 中的if 语句启动/停止/重新启动/卸载您的程序。

#!/bin/bash

start_module() {
      # Your start Code
}

stop_module() {
      # Your stop Code
}

restart_module() {
      # Your restart Code
}

uninstall_module() {
      # Your uninstall Code
}


if [ $# != 1 ]; then                # If Argument is not exactly one
    echo "Some message"
    exit 1                         # Exit the program
fi


ARGUMENT=$(echo "$1" | awk '{print tolower($0)}')     # Converts Argument in lower case. This is to make user Argument case independent. 

if   [[ $ARGUMENT == start ]]; then

    start_module

elif [[ $ARGUMENT == stop ]]; then

    stop_module

elif [[ $ARGUMENT == uninstall ]]; then

    uninstall_module

elif [[ $ARGUMENT == restart ]]; then

    restart_module

else 
    echo "Only one valid argument accepted: START | STOP | RESTART | UNINSTALL
          case doesn't matter. "
fi

将此代码保存到 myScript.sh

Usage: 

./myScript.sh Start
./myScript.sh Stop
./myScript.sh check
./myScript.sh uninstall

这是体现这种执行方式的真实程序示例。

旁注:省略任何现有的模块/功能或添加另一个可以轻松完成。

如何取出/抑制特定模块的运行(例如维护)?

if 语句块中取出特定模块将禁用它,因为在运行时不会调用该模块。

于 2018-02-16T18:31:04.307 回答