Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 带参数的Shell脚本?_Bash_Shell_Sh_Aix - Fatal编程技术网

Bash 带参数的Shell脚本?

Bash 带参数的Shell脚本?,bash,shell,sh,aix,Bash,Shell,Sh,Aix,我有一个获取参数的shell脚本,下面是代码 现在,如果像下面这样调用,它将只接受传递的参数:script.sh--mode=load(或-m=load) 有没有一种方法可以修改它,以便可以使用或不使用“=”符号调用它,这样我就可以调用:script.sh--mode load(或-m load) 理想情况下,我需要在纯bash中工作,因为我无法安装其他工具等 for i in "$@" do case $i in -m=*|--mode=*) MODE="${i#*=}" if [[

我有一个获取参数的shell脚本,下面是代码

现在,如果像下面这样调用,它将只接受传递的参数:script.sh--mode=load(或-m=load)

有没有一种方法可以修改它,以便可以使用或不使用“=”符号调用它,这样我就可以调用:script.sh--mode load(或-m load)

理想情况下,我需要在纯bash中工作,因为我无法安装其他工具等

for i in "$@"
do
case $i in
 -m=*|--mode=*)
 MODE="${i#*=}"
  if [[ $MODE =~ ^(dump|load)$ ]]; then
   echo "" > /dev/null
  else
   bark "Invalid --mode set, set this to dump or load.";
   exit 1
  fi
 ;;
 -p=*|--db-path=*)
 DBPATH="${i#*=}"
 ;;
 -d=*|--dump-dir=*)
 DUMPDIR="${i#*=}"
 ;;
 -l=*|--list-file=*)
 TABLES="${i#*=}"
  # check if file exists on disk
  if [ -e $TABLES ]
  then
   echo "" >> /dev/null
  else
   bark "Table file not found!";
   exit 1
  fi
 ;;
 -t=*|--tenant-name=*)
 TENANT="${i#*=}"
  # check if tenant is correct
  if [[ $TENANT =~ ^($TENANT_LIST)$ ]]; then
   echo "" >> /dev/null
  else
   bark "Tenant name does not match, aborting.";
   exit 1
  fi
 ;;
 -s|--shared)
 SHARED=YES
 ;;
 *) usage # unknown option
 ;;
esac
done
我的bash版本:

bash——版本 GNU bash,版本4.3.22(1)-发行版(powerpc-ibm-aix5.1.0.0)

在$@上循环。当$1为“-m”时,进行轮班。因此,在下一个循环中,$1现在将是-m选项的参数

script.sh --mode load

# FIRST LOOP
$@ is "--mode load"
$1 is "--mode"   
shift

# SECOND LOOP
$@ is "load"
$1 is "load"

如果可以指定多个参数,而不是像现在这样只指定一个参数,那么这也很有用。应该进行错误检查以验证参数值,如果用户在没有其他参数的情况下执行了
script.sh--mode

不要重新发明轮子

如果您只需要1个字符的选项,请使用bash内置的
getopts

#!/bin/bash

while getopts :m:p:d:l:t:s opt; do
    case $opt in
        m) mode=$OPTARG ;;
        p) dbpath=$OPTARG ;;
        d) dumpdir=$OPTARG ;;
        l) tables=$OPTARG
           # test file existence
           ;;
        t) tenant=$OPTARG
           # test tenant
           ;;
        s) shared=YES ;;
        :) echo "Missing argument for option -$OPTARG" >&2 
           exit 2
           ;;
        *) echo "Invalid option -$OPTARG" >&2
           exit 2
           ;;
    esac
done
shift $((OPTIND - 1))

cat << SHOW_VARS
I have:
mode=$mode
dbpath=$dbpath
dumpdir=$dumpdir
tables=$tables
tenant=$tenant
shared=$shared
rest of args=$*
SHOW_VARS

不要重新发明轮子。如果您想支持长选项,请安装GNU
getopt
命令。我不知道您运行的是哪个版本的AIX,但在我的V6上,默认安装了getopt。有一个/usr/bin/getopt程序;getoption--version=version--。尝试第二个选项似乎不起作用,有没有办法使用第一个示例但使用长字符选项?我只见过真正可怕的黑客迫使
getopts
玩长选项。
tempargs=$(
    getopt \
        -o m:d:l:t:s \
        --long mode:,db-path:,dump-dir:,list-file:,tenant-name:,shared \
        -- "$@"
)
if [[ $? -ne 0 ]]; then echo "Error..." >&2; exit 2; fi
eval set -- "$tempargs"

while true; do
    case $1 in
        -m|--mode) mode=$2; shift 2;;
        -p|--db-path) dbpath=$2; shift 2;;
        -d|--dump-dir) dumpdir=$2; shift 2;;
        -l|--list-file) tables=$2
           # test file existence
           shift 2
           ;;
        -t|--tenant-name) tenant=$2
           # test tenant
           shift 2
           ;;
        -s|--shared) shared=YES; shift;;
        --) shift; break ;;
        *) echo "Error..." >&2; exit 2 ;;
    esac
done