避免使用2个选项的Shell脚本可以同时使用

时间:2014-08-29 16:44:45

标签: bash shell

我正在写一个shell脚本

它工作得很好,我唯一的问题是我想避免在目录中使用我的参数执行命令时同时使用-d)和-x两个选项的可能性。 这可以通过我的代码中的最小变化来实现吗?

#!/bin/bash

   dir=$1

if [ $# -lt 1 ] ; then
   echo "ERROR: no argument"
   exit 1 # pas 0
else
    case $2
in
    -d)
       mv $dir/ /tmp/
       echo 'moving with -d'
       ;;
    -x)
       for f in "$dir"/*; do [[ -x $f ]] && mv "$f" /tmp; done
       echo 'moving executables'
       ;;
    *)
       mv $dir/* /tmp/
       echo 'no flag passed so moving all'
       echo "mv $dir/* /tmp/"
       ;;
     esac
 fi

1 个答案:

答案 0 :(得分:1)

我会以另一种方式做到:首先提取选项,然后"如果"它

#!/bin/bash

dir=$1

shift

while [ $# -gt 0 ] ; do
    case $1
    in
    -d)
       D_OPTION_SELECTED=1
       ;;
    -x)
       X_OPTION_SELECTED=1
       ;;
     esac
    shift
done

help() {
 echo "Usage $0 dir [-x or -d]";
}

if [[ "$dir" == "" ]]; then help; exit 1; fi
if [[ $D_OPTION_SELECTED -gt 0 && $X_OPTION_SELECTED -gt 0 ]]; then help; exit 1; fi

if [[ $D_OPTION_SELECTED -gt 0 ]]; then echo D selected; fi
if [[ $X_OPTION_SELECTED -gt 0 ]]; then echo X selected; fi

但请记住,好的规则是在第一时间允许选项。所以更好的版本是:

#!/bin/bash

while [ $# -gt 0 ] ; do
    case $1
    in
    -d)
       D_OPTION_SELECTED=1
       ;;
    -x)
       X_OPTION_SELECTED=1
       ;;
    *)
       dir=$1
       ;;
     esac
    shift
done

help() {
 echo "Usage $0 [-x or -d] dir";
}

if [[ "$dir" == "" ]]; then help; exit 1; fi
if [[ $D_OPTION_SELECTED -gt 0 && $X_OPTION_SELECTED -gt 0 ]]; then help; exit 1; fi

if [[ $D_OPTION_SELECTED -gt 0 ]]; then echo D selected; fi
if [[ $X_OPTION_SELECTED -gt 0 ]]; then echo X selected; fi
echo dir=$dir