带参数的Shell脚本?
Posted
技术标签:
【中文标题】带参数的Shell脚本?【英文标题】:Shell script with parameters? 【发布时间】:2018-11-18 16:36:12 【问题描述】:我有一个带参数的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 --version
GNU bash,版本 4.3.22(1)-release (powerpc-ibm-aix5.1.0.0)
【问题讨论】:
不要重新发明***。如果要支持长选项,请安装 GNUgetopt
命令。
不知道你运行的是哪个版本的AIX,但是在我这里的V6上,getopt是默认安装的。
【参考方案1】:
不要重新发明***。
如果您只接受 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
否则,您可以使用外部getopt
程序来帮助解析您的参数。我没有要测试的 AIX 机器,所以 YMMV
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
【讨论】:
有一个/usr/bin/getopt程序; getoption --version = 版本 --. 尝试您的第二个选项似乎不起作用,有没有办法使用您的第一个示例但使用长字符选项? 我只见过真正可怕的黑客来迫使getopts
使用长选项。【参考方案2】:
循环 $@。当 $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
。
【讨论】:
以上是关于带参数的Shell脚本?的主要内容,如果未能解决你的问题,请参考以下文章