2016-12-18 13 views
-2

コマンドラインで提供されているオプションに基づいて '昨日'または '明日'のいずれかを出力するシェルスクリプトを実行したいとします。オプションが-yの場合、出力は 'yesterday'、そうでない場合は 'tomorrow'です。さらに、スクリプトの構文を表示するオプションhelp -hを追加したいと思います。オプションの有無にかかわらずシェルスクリプトを実行する

私は、スクリプトを作った:

#! /bin/bash 

h= y= 

while getopt :f:vql opt 
do 
    case $opt in 
    y) setday=true 
    ;; 
    h) tohelp=true 
    ;; 
    esac 
done 

shift $((OPTIND - 1)) 

if [setday=true] 
    NAME=$yesterday 
else 
    NAME=$tomorrow 
fi 

if [tohelp=true] 
    MSG=$'runner [-y]' 

echo $NAME 
echo $MSG 

が、私はそれを実行したとき、私は単に私が間違って取得しています何

-- opt 
-- opt 
-- opt 
etc 

を印刷し、無限ループを取得しますか?

+2

[shellcheck.net]でスクリプトを貼り付けてください(http://shellcheck.net)に'['、 ']'や '='の周囲に空白がないなどの基本的な問題があります。 – mklement0

答えて

-1

これは動作するはずです。

#!/bin/bash 

setday=false 
tohelp=false 

yesterday="Yesterday" 
tomorrow="Tomorrow" 

for i in "[email protected]" 
do 
case $i in 
    -y) 
     setday=true 
     shift 
     ;; 
    -h) 
     tohelp=true 
     shift 
     ;; 
esac 
shift 
done 

if [ $setday = true ]; then 
    NAME=$yesterday 
else 
    NAME=$tomorrow 
fi 

if [ $tohelp = true ]; then 
    MSG='runner [-y]' 
fi 

echo $NAME 
echo $MSG 
-1

@イタチの答えがよさそうです。あなたはgetoptsはを引き続き使用したい場合は、けれども、これも動作するはずです:

#! /bin/bash 

yesterday="yesterday" 
tomorrow="tomorrow" 
setday=false 
tohelp=false 

while getopts "yh" opt 
do 
    case $opt in 
    y) 
     setday=true 
     ;; 
    h) 
     tohelp=true 
     ;; 
    esac 
done 

shift $((OPTIND - 1)) 

if $tohelp; then 
    echo "runner [-y]" 
    exit 
elif $setday; then 
    NAME=$yesterday 
else 
    NAME=$tomorrow 
fi 

echo $NAME 

出力:

$ ./test.sh 
tomorrow 
$ ./test.sh -y 
yesterday 
$ ./test.sh -h 
runner [-y] 
+0

ありがとう、両方のスクリプトが完璧に動作し、今私は使用法をより明確にしています – Gigiux

関連する問題