2017-06-29 7 views
0

少し説明が必要:なぜこれは機能しませんか? $ ./script.sh iso
と私は、これは上記 スクリプトでは意味がないと思いますけれども、私も(このように試してみた:引数が渡されたかどうかがbashスクリプトの文字列と等しいかどうかを調べる

#!/bin/bash 

ker=$1 
if [ "$ker" != "iso" ] || [ "$ker" != "om" ] || [ "$ker" != "constbeta" ] ; then 
printf " allowed kernels: iso, om, constbeta \n" 
exit 
fi 
wait 
echo 'anisotropy kernel: ', "$ker" 

はまた、私はこのようにそれを呼び出す

#!/bin/bash 

ker="$1" 
if [ $ker != "iso" ] || [ $ker != "om" ] || [ $ker != "constbeta" ] ; then 
printf " allowed kernels: iso, om, constbeta \n" 
exit 
fi 
wait 
echo 'anisotropy kernel: ', "$ker" 

を試してみました):$ ./script.sh "iso"
私はいつも得ますallowed kernels: iso, om, constbeta
エラーを発見することができる人に多くの感謝。

答えて

1

論理または||のため、&&を使用する必要があります。そうでない場合は、否定文字列を3つの値と等しくすることはできません。

1

あなたは$kerは、 "ISO" であれば、それは "OM" と条件の一致ではありません...

if [ "$ker" != "iso" ] || [ "$ker" != "om" ] || [ "$ker" != "constbeta" ] ; then 

を不合理な条件を持っています。 $kerが "om"の場合、 "iso"でなく条件が一致します。あなたが望むのは、ORチェックリストではなく、ORチェックではなく、 "else"条件です。

if [ "$ker" = "iso" ] || [ "$ker" = "om" ] || [ "$ker" = "constbeta" ] ; then 
    : do something useful 
else 
    : report error 
fi 

それとも、あなたはbashでているので、あなたは "シンプルな" 条件使用することができますあなたが好きな場合は、他の構造を使用することができますが

if [[ "$ker" =~ ^(iso|om|constbeta)$ ]]; then 

を:

case "$ker" in 
    iso|om|constbeta) 
    : this catches our "good" values 
    ;; 
    *) 
    echo "Error" >&2 
    exit 1 
    ;; 
esac 

このPOSIXに準拠している可能性があります。

+0

私はそれを手に入れました。あなたがた両方に感謝します。 ps:あなたの2番目の提案はうまくいきませんが、私は私たちの数字を – andrea

+0

@andrea - Varsågodと考えています。 :)第二の提案は、仕事の代わりに何をするのですか?間違いはありますか? – ghoti

+0

いいえ、動作します。それはちょうど私が思ったように(つまり反対に)働かない。私はまだ構文を書いてbashを学ぶ必要がある、私はそれのための時間がない。タクソーマイケット! – andrea

関連する問題