bash - 标志参数选项语句的正确逻辑

时间:2014-02-25 17:52:38

标签: bash shell

我有两种方案可以解决脚本的正确问题,否则需要将其标记为错误用法。对于选项(标志或参数,不确定那些引用是什么)会是正确的逻辑吗?如果我在主代码之前或之后放置函数是否重要?

编辑问题:当我打电话没有变量时,我的逻辑没有捕获?它实际上尝试执行并且不显示任何用法。第二个问题,如果我输入一个文件输入但它不存在,它仍然试图执行?如何处理这些情况?

./ 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 ???

1 个答案:

答案 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