2016-10-20 47 views
0

我寫了一個腳本,其中「CASE」部分標識輸入的字節/字符是Lower,Upper,digit還是一些特殊字符。程序運行良好,但奇怪的是;當我輸入字母「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':'LC_ALL = C ./script「A」'和'sh -x ./scrip「A 「'擺脫'locale'問題。 – heemayl

+2

另外,如果沒有shebang行,不知道在sh中調用腳本時shell運行在哪個shell中,sh'也不清楚,因爲它可能是'bash','dash'或其他任何依賴於在您的發行的味道。 – choroba

回答

0

所以你是兩個不同的問題咬傷:

  • 因爲缺少家當你的腳本將/可以通過不同 shell的實現被執行當與sh ./script.sh分別運行時。 ./script.sh

  • bash(恰好在作爲./script.sh運行時執行該腳本)可以匹配A[a-z]特定區域設置。

的解決辦法是指定一個認領和整理序列:

#!/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 [so]說「謝謝」的方式是* upvote *。如果帖子回答你的問題,你應該(也)*接受*它。 –

+0

'LC_COLLATE'設置排序順序(字符在給定的「語言環境」中如何排序,被認爲是相等的......)。 'C'是['POSIX語言環境'](https://docs.oracle.com/cd/E23824_01/html/E26033/glmbx。HTML#glmar),它會整理「針對計算機而不是人類」 –

相關問題