Bash 重新排列getopt输出,以便每次都首先执行一个特定的参数(如果给定)

Bash 重新排列getopt输出,以便每次都首先执行一个特定的参数(如果给定),bash,shell,getopt,Bash,Shell,Getopt,有没有办法重新安排getopt 看一下使用gnugetopt的简单脚本 #!/bin/bash TEMP=`getopt -o abc -n 'test.sh' -- "$@"` eval set -- "$TEMP" while true ; do case "$1" in -a) echo "alpha" ;shift ;; -b) echo "bravo" ;shift ; -c) echo "charlie" ;shift

有没有办法重新安排getopt

看一下使用gnugetopt的简单脚本

#!/bin/bash
TEMP=`getopt -o abc -n 'test.sh' -- "$@"`
eval set -- "$TEMP"

while true ; do
    case "$1" in
        -a) echo "alpha"   ;shift ;;
        -b) echo "bravo"   ;shift ;
        -c) echo "charlie" ;shift ;;
        -d) echo "delta"    ;shift ;;
        --) shift ; break ;;
        *) echo "error!" ; exit 1 ;;
    esac
done
产出:

$./alpha-project -c -a -b 
  charlie
  alpha
  bravo


$./alpha-project -b -c -a
  bravo
  charlie
  alpha
期望输出:

$./alpha-project -c -a -b 
  alpha
  charlie
  bravo


$./alpha-project -b -c -a
  alpha
  bravo
  charlie

现在,无论参数中的-a位于何处,都必须首先执行-a案例。

一种解决方案是显式重新排列位置参数,如下所示

#!/bin/bash
# Say you want '-a' to be first every time
temp="$( getopt -o abc -n 'test.sh' -- "$@" )"
temp="$(sed -E ':l1;s/(-[^a]) (-a)/\2 \1/g;/-[^a] -a/bl1' <<< "$temp")" #re-arrangement part


while true ; do
    case "$1" in
        -a) echo "alpha"   ;shift ;;
        -b) echo "bravo"   ;shift ;; # A semicolon is missing in question
        -c) echo "charlie" ;shift ;;
        -d) echo "delta"    ;shift ;;
        --) shift ; break ;;
        *) echo "error!" ; exit 1 ;;
    esac
done
请注意,该替换项除了管理输入(如
-b-a-c-a-a
)外,还完成了一些繁重的工作。对于涉及位置参数值的更复杂情况,需要更复杂的替换


警告:用户变量使用小写字母,即TEMP->TEMP

第一次可以解析-a和后面的其他


您不应该在选项解析循环中执行任何操作。您应该只设置variables/config,以便程序的其余部分执行它应该执行的操作。当您这样做时,您的订购问题就消失了

如果您查看,您将看到,即使是工具本身也会在内部执行此操作。选项循环中不执行任何操作,它只为程序的其余部分设置变量和数据结构

您也可以这样做:

#!/bin/bash
temp=`getopt -o abc -n 'test.sh' -- "$@"`
eval set -- "$temp"

alpha=""
bravo=""
charlie=no
while true ; do
    case "$1" in
        -a) alpha=1     ;shift ;;
        -b) bravo=1     ;shift ;;
        -c) charlie=yes ;shift ;;
        --) shift ; break ;;
        *) echo "error!" ; exit 1 ;;
    esac
done

if [[ -n "$alpha" ]]
then
  echo "Doing alpha (charlie: $charlie)"
fi

if [[ -n "$bravo" ]]
then
  echo "Doing bravo (charlie: $charlie)"
fi
以下是运行时发生的情况:

$ ./testscript -b -a -c
Doing alpha (charlie: yes)
Doing bravo (charlie: yes)

$ ./testscript -ab
Doing alpha (charlie: no)
Doing bravo (charlie: no)
#!/bin/bash
temp=`getopt -o abc -n 'test.sh' -- "$@"`
eval set -- "$temp"

alpha=""
bravo=""
charlie=no
while true ; do
    case "$1" in
        -a) alpha=1     ;shift ;;
        -b) bravo=1     ;shift ;;
        -c) charlie=yes ;shift ;;
        --) shift ; break ;;
        *) echo "error!" ; exit 1 ;;
    esac
done

if [[ -n "$alpha" ]]
then
  echo "Doing alpha (charlie: $charlie)"
fi

if [[ -n "$bravo" ]]
then
  echo "Doing bravo (charlie: $charlie)"
fi
$ ./testscript -b -a -c
Doing alpha (charlie: yes)
Doing bravo (charlie: yes)

$ ./testscript -ab
Doing alpha (charlie: no)
Doing bravo (charlie: no)