2017-02-04 11 views
0

の場合最初の入力が.txtで終了するかどうかを確認する方法を理解しようとしています。私は入力を取得する方法に基づいて私のコードには文の構文が適用されない場合、標準のように思えます。私の最初のifステートメントのelse ifステートメントの正しい構文を誰かが知っていますか?文の構文がエラー

elif [[ "$1" = *.txt ]] 

あなたはまた、正規表現のマッチングを使用することができます:(マッチングを無効に引用符を除去しながら)バッシュ二重括弧条件文を使用することができ、動作するようにパターンマッチングするためには

#!/bin/sh 

printf "%b %b\n" "$*" 

if [ "$1" = "-help" ] 
then 
    echo "Cool Beans" 
elif [ "$1" = "*.txt" ] 
then 
    echo "text recd" 

else 
    echo "first input not valid" 
fi 

if [ "$2" = "-help" ] 
then 
    echo "help options" 
else 
    echo "second input not valid" 
fi 
+0

をbashであなたは確かにマッチする正規表現を使用することができます(例えば、[[$ 1 =〜\ .txtファイル]])または変数置換を(例:[[$ {1%*。} = txt]])。これがshに当てはまるかどうかはわかりません。ほとんど確実に*は引用符で囲まれていなければ展開されます... – setempler

+0

@setemplerありがとう。 Imは実際にshにタグを変えるつもりです。 didntはそれについて考えていました。 – Jimmy

答えて

2

elif [[ "$1" =~ [.]txt$ ]] 

「任意の文字」の特別な意味が無効になるのを防ぐために、ピリオドをエスケープする(または、私のように括弧内に入れる)必要があることに注意してください。末尾に$が含まれているので、ファイル名内のサブ文字列ではなく、拡張子と一致すると確信できます。

あなたはbashの固有ではない何かをしたい場合は、あなたが試すことができます:

elif [ "${1##*.}" = txt ] 

"${1##*.}"拡大が1という名前の変数の先頭から最長の文字列を削除します(任意の変数もよい)と拡張子だけを残して、ピリオドで終わります。

+0

ニースですが、タグは 'sh'のもので、' bash'のものではありません – clearlight

+0

@clearlight私が間違っていない限り、最後の提案はPOSIX準拠でなければなりません。 – Fred

+0

@Fredは助けてくれてありがとう – Jimmy

0

また、POSIX互換のパターンマッチングにcaseステートメントを使用することができます。

printf "%b %b\n" "$*" 

case $1 in 
    -help) echo "Cool Beans" ;; 
    *.txt) echo "text recd" ;; 
    *) echo "first input not valid" 
esac 

case $2 in 
    -help) echo "help options" ;; 
    *) echo "second input not valid" ;; 
esac