使用命令行参数的标志运行ShellScript

时间:2016-08-11 12:08:50

标签: bash shell freebsd

我昨天开发的代码,将文件(x.txt)或空格分隔数字(434 435 436 437)作为输入,并将数据推送到数组中并循环通过。

Syntax: shtest.sh 434 435 436 or sh test.sh x.txt

MYFILE=$1 ;
OLDIFS=$IFS;
IFS=' ';

if [ -f "$MYFILE" ]; then
   testCases=($(cat $MYFILE));
else
   testCases=($@);
fi
for testCase in "${testCases[@]}"
do
   echo "Running Testcases $testCase"
done

我想这样做的方式,以减少错误

  1. 我希望在运行上述脚本并将文件作为参数时实际拥有一个标志

    sh test.sh -f myFile.txt

    或者可以使用-t flasg运行,并使用数字作为参数

    sh test.sh -t 434 435 436

  2. 如果-f和-t都存在,那么我必须检查并抛出错误
    例如:sh test.sh -f myFile.sh -t 343 435 435或      sh test.sh -t 343 435 435 -f myFile.sh

  3. 我昨天刚开始研究Shell Scripting,而且我真的不知道如何在语法上做到这一点

    最后,如果我们有标记文件或带标记的数字参数(根本没有Unfalgged),下面的代码是否有用或者是否有任何问题     语法:

    sh test.sh -f myFile.txt             #should work
    sh test.sh -t 443 444 443 443        # should work
    sh test.sh -f myFile.txt -t 443 444 443 443  # should fail
    
    
     isFile=0;
     isTest=0;
    
     while getopts ":f:c:t:" opt; do
             case $opt in
             f)
               echo "-f was triggered, Parameter: $OPTARG" >&2
               testCases=($(cat $OPTARG));
               isFile=1;
               ;;
             t)
               # testCases=($@);
                multi+=("$OPTARG")
                for val in "${multi[@]}"; do
                       echo " - $val"
                done
                ;;
             c)
               echo "-c was triggered, Parameter: $OPTARG" >&2;
               isTest=1;
               ;;
             \?)
               echo "Invalid option: -$OPTARG" >&2
               exit 1
               ;;
             :)
               echo "Option -$OPTARG requires an argument." >&2
               exit 1
               ;;
           esac
         done
    
     # Exit if both flags are sent
     if [ isTest==1 && isFile==1 ]; then
     {
       echo "Exiting";
     }
     fi
    
     #if the flag is not avaiable, the store the orphan numbers (Command Line Arguments)
    
    
     for testCase in "${testCases[@]}"
     do
        echo "Running Testcases $testCase"
     done
    

    请提供意见和任何帮助表示赞赏。

    由于 特加斯

1 个答案:

答案 0 :(得分:0)

while getopts循环后,添加:

shift $(($OPTIND - 1))

if [ $isFile = 0 ] && [ $# = 0 ]
then
    echo "$0: must specify file (-f file) or numbers" >&2
    exit 1
fi

我假设您在循环之前有isFile=0。如果您未明确设置它,则可以继承用户意外设置的环境变量。请务必小心,不要意外地使用调用脚本的代码中的环境变量。