2016-10-20 4 views
0

"CASE"部分が入力されたバイト/文字が下位、上位、数字または特殊文字であるかどうかを識別するスクリプトを記述しました。プログラムは正常に動作しますが、奇妙なことがあります。私はアルファベット「A」と入力し、出力が正しいCASEはデバッグモードとノーマルモードで異なる動作をします

sh -x ./scrip "A" 

出力

+ [ 1 -ne 1 ] 
+ char=A 
+ wc -c 
+ echo A 
+ NumOfChars=2 
+ [ 2 -gt 2 ] 
+ echo Arguments are correct in numbers 
Arguments are correct in numbers 
+ echo Upper case alphabet 
Upper case alphabet 

を(実行する場合、すなわちケース[AZ]は

を実行しているが、私はプログラムを実行するときですすなわち、通常の方法

./script "A" 

出力

Lower case alphabet 

代わりにCASE [a-z]が実行されますが、なぜですか?

if [ "$#" -ne 1 ]; then 
    echo "Number of arguments are wrong" 
    exit 1; 

else 
    char="$1" 
    NumOfChars=$(echo "$char" | wc -c) 
    if [ "$NumOfChars" -gt 2 ]; then 
     echo "Number of characters are greater then one" 
     exit 2; 
    else 
     echo " Arguments are correct in numbers "; 
    fi 
fi 
case "$char" 
in 

[a-z]) echo "Lower case alphabet";; 
[A-Z]) echo "Upper case alphabet";; 
[0-9]) echo "Digit";; 
*)  echo "Non AlphaNumeric characters/byte";; 
esac 
+0

スクリプトは '両方の場合において小文字alphabet'を出力します。たぶんあなたは実際に別のスクリプトを呼んでいるのでしょうか、それともこの投稿の入力ミスですか? 'sh -x ./scrip" A "'? ( 'sh -x ./script" A "'を意味しましたか?) –

+0

LC_ALL = C ./script "A" 'と' sh -x ./scrip "Aの両方に' LC_ALL = C'を付加します。 "' 'ロケール 'の問題を取り除く。 – heemayl

+2

また、シバンラインがなければ、 'sh'なしで呼び出されたときにスクリプトがどのシェルで実行されているのか不明です。' bash'、 'dash'などに依存するので、' sh'とは不明です。あなたの流通の味について。 – choroba

答えて

0

ので、あなたは、2つの異なる問題にかまれ、次のようにスクリプトがある:あなたのスクリプトが/ 異なるシェルの実装によって実行することができます欠落シェバングのため

  • sh ./script.sh respで実行すると(./script.shとして実行時にスクリプトを実行するために起こる)./script.sh

  • bashは、特定のロケール[a-z]Aを一致させることができます。

修正はシェバングとコレート配列の両方を指定することである。

#!/bin/sh 
export LC_COLLATE="C" 

# the rest of the script is unchanged. 
if [ "$#" -ne 1 ]; then 
    echo "Number of arguments are wrong" 
    exit 1; 

else 
    char="$1" 
    NumOfChars=$(echo "$char" | wc -c) 
    if [ "$NumOfChars" -gt 2 ]; then 
     echo "Number of characters are greater then one" 
     exit 2; 
    else 
     echo " Arguments are correct in numbers "; 
    fi 
fi 
case "$char" 
in 

[a-z]) echo "Lower case alphabet";; 
[A-Z]) echo "Upper case alphabet";; 
[0-9]) echo "Digit";; 
*)  echo "Non AlphaNumeric characters/byte";; 
esac 
+0

ありがとうございます。出来た。しかし、私はLC_COLLATE = "C"の意味を持っていません。その目的は何ですか? –

+0

@ NoumanTajik「ありがとう」と言っているのは、*アップコート*です。投稿があなたの質問に答えるならば、あなたはそれも受け入れるべきです。 –

+0

'LC_COLLATE'は、照合順序(文字がどのようにソートされるか、等しいと見なされるか、...与えられた'ロケール 'の中で)を設定します。 'C'は[POSIXロケール](https://docs.oracle.com/cd/E23824_01/html/E26033/glmbx)です。html#glmar)は、 "人間よりもむしろコンピュータのために"照合を行います –

関連する問題