Bash 重新排列getopt输出,以便每次都首先执行一个特定的参数(如果给定)
有没有办法重新安排getopt 看一下使用gnugetopt的简单脚本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
#!/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)