我有两种方案可以解决脚本的正确问题,否则需要将其标记为错误用法。对于选项(标志或参数,不确定那些引用是什么)会是正确的逻辑吗?如果我在主代码之前或之后放置函数是否重要?
编辑问题:当我打电话没有变量时,我的逻辑没有捕获?它实际上尝试执行并且不显示任何用法。第二个问题,如果我输入一个文件输入但它不存在,它仍然试图执行?如何处理这些情况?
./ example.sh -i input.file
./ example.sh -i input.file -o output.file
usage()
{
cat << EOF
usage: $0 options
This script run with two types of formats.
./example.sh -i input.file
Note: In this above case, a predesignated name will give for output files.
./example.sh -i input.file -o output.file
OPTIONS:
-h Show this message
-i Input file - ./example.sh -i input.file
-o Outpute file - .example.sh -i input.file -o output.file
EOF
}
INPUTFILE=
OUTPUTFILE=
while getopts “i:io:h:?” OPTION
do
case $OPTION in
i)
INPUTFILE=$OPTARG
;;
o)
OUTPUTFILE=$OPTARG
;;
h)
usage
exit 1
;;
?)
usage
exit
;;
esac
done
jm666建议回答:
#!/bin/bash
#define your options here
OPT_STR="h:i:o:c"
do_work() {
#your main work-code here
}
#common functions
err() { 1>&2 echo "$0: Error: $@"; return 1; }
required_arg() { err "Option -$1 need argument"; }
checkarg() { [[ "$1" =~ ${optre:--} ]] && { required_arg "$2"; return 1; } || { echo "$1" ; return 0; } }
phelp() { err "Usage: $0" "$(sed 's/^://;s/\([a-zA-Z0-9]\)/ -&/g;s/:/ [arg] /g;s/ */ /g' <<< "$OPT_STR")"; return 1; }
## MAIN
declare -A OPTION
optre=$(sed 's/://g;s/.*/-[&]/' <<<"$OPT_STR")
while getopts "$OPT_STR" opt;
do
#change here a,b,c to your options
case $opt in
i) OPTION[$opt]=$(checkarg "$OPTARG" $opt) || exit 1;;
o) OPTION[$opt]=$(checkarg "$OPTARG" $opt) || exit 1;;
c) OPTION[$opt]=1;;
h) phelp || exit 1;;
:) required_arg "$OPTARG" || exit 1 ;;
\?) err "Invalid option: -$OPTARG" || exit 1;;
esac
done
shift $((OPTIND-1))
echo "iarg: ${OPTION[i]:-undefined}"
echo "oarg: ${OPTION[o]:-undefined}"
echo "carg: ${OPTION[c]:-0}"
echo "remainder args: =$@="
for arg in "$@"
do
do_work "$arg"
done
建议修改jm666
在尝试了解从原始代码添加变量赋值的位置时遇到问题,例如INPUTFILE和OUTPUTFILE ???
答案 0 :(得分:0)
我刚刚结束保存我的代码并编写一个函数来检查FILEINPUT是否存在,这确保了如果你输入一个文件或者没有-o,那么它会捕获它。
INPUTFILE=
OUTPUTFILE=
while getopts i:o:h OPTION
do
case $OPTION in
i)
INPUTFILE=$OPTARG
;;
o)
OUTPUTFILE=$OPTARG
;;
h)
usage
exit 1
;;
?)
usage
exit
;;
esac
done
if [ ! -f $INPUTFILE ]; then
echo "File not found!"
usage
exit
fi