2016-12-05 20 views
2

getoptを再配置する方法はありません。getopt出力を再配置します。特定の引数が毎回実行されます(指定されている場合)

gnu getoptを使用する単純なスクリプトを見てください。

#!/bin/bash 
TEMP=`getopt -o abc -n 'test.sh' -- "[email protected]"` 
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の場合は、最初に実行する必要があります。

答えて

0

一つの解決策を明示的これはあなたに望ましい結果が得られます

#!/bin/bash 
# Say you want '-a' to be first every time 
temp="$(getopt -o abc -n 'test.sh' -- "[email protected]")" 
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のような入力を管理するだけでなく、いくつかの重量物の持ち上げを行うこと

# ./40978894 -b -a -c -a 
alpha 
alpha 
bravo 
charlie 
# ./40978894 -b -a -c 
alpha 
bravo 
charlie 
# ./40978894 -b -a -c -a -a 
alpha 
alpha 
alpha 
bravo 
charlie 

注意を実行します。位置パラメータの値を含むより複雑なケースでは、より複雑な置換が必要です。


警告:ユーザー変数の使用小文字TEMP、すなわち - あなたは-aを解析し、他の人の後にすることができます>一時

0

初めて。

#!/bin/bash 
TEMP=`getopt -o abc -n 'test.sh' -- "[email protected]"` 

eval set -- "$TEMP" 
while true ; do 
    case "$1" in 
     -a) echo "alpha" ;break ;; 
     -b|-c|-d) shift ;; 
     *) break ;; 
    esac 
done 

eval set -- "$TEMP" 
while true ; do 
    case "$1" in 
     -a) shift ;; 
     -b) echo "bravo" ;shift ;; 
     -c) echo "charlie" ;shift ;; 
     -d) echo "delta" ;shift ;; 
     --) shift ; break ;; 
     *) echo "error!" ; exit 1 ;; 
    esac 
done 
0

あなたは、オプションの解析ループ内の任意のアクションを行うべきではありません。変数/ configを設定して、プログラムの残りの部分が行うべきことを行うようにしてください。そうすると、注文の問題は消えます。

getopt source codeを見ると、ツール自体でさえ内部的に行われることがわかります。オプションループでは何も実行されず、残りのプログラムの変数とデータ構造体だけが設定されます。

あなたが同じことを行うことができます。

#!/bin/bash 
temp=`getopt -o abc -n 'test.sh' -- "[email protected]"` 
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) 
関連する問題