2016-10-10 19 views
1

我一直在想辦法測試一個參數是否是使用命令expr的數字。如何測試參數是否是使用expr的腳本中的數字?

在我的腳本到目前爲止,我已經寫了:

expr $1 + 1 2>/dev/null 
if [ $? -eq 2 -o $1 -lt 0 ] 
then 
    echo "$1 is not a positive integer" >&2 
    exit 1 
fi 

我想在這裏做的是1添加到變量。如果這會引發錯誤(表示該變量不是數字),則結果將被髮送到/ dev/null。 之後,我測試返回碼是2還是變量小於0. 但是,這似乎不工作......任何想法?

P.S.請記住,我必須使用expr

+0

你嘗試沒有'2>的/ dev/null'。另外,你是否知道'set -x'用於調試(和'set + x'關閉)。你有什麼樣的投入? (請編輯Q)。最後,「man expr」說什麼?祝你好運。 – shellter

+1

'-o'不會在bash中短路。評估操作員的雙方。 – Phylogenesis

回答

0

你的評估條件的任何的$1值,這意味着如果$1不是一個數字,shell將拋出一個語法錯誤。

我首先檢查是否expr失敗(不要預先假設錯誤代碼,只是測試非零)。如果是這樣,我設置錯誤標誌。 那麼,如果沒有設置錯誤標誌,我知道這是一個數字,然後我檢查陽性(錯誤標記從評估$1與非整數保護。

不知道這是最好的方式,但作品:

error=0 

expr $1 + 1 2>/dev/null >/dev/null 

if [ $? -ne 0 ] ; then 
    error=1 
fi 
if [ $error -eq 0 ] ; then 
    if [ $1 -lt 0 ] ; then 
    error=1 
    fi 
fi 

if [ $error -eq 1 ] ; then 
    echo "$1 is not a positive integer" >&2 
    exit 1 
fi 

測試:

$ exprtest.sh foo 
foo is not a positive integer 

$ exprtest.sh 4 

$ exprtest.sh -5 
-5 is not a positive integer 

注:0通過了測試,雖然有些人可能會反對,這不是嚴格意義上的整數

0

你也可以試試這個;

#!/bin/bash 
expr $1 + 1 2>/dev/null >/dev/null 
if [ $? -eq 2 ] || [ $1 -lt 0 ] 
then 
    echo "$1 is not a positive integer" >&2 
    exit 1 
fi 

如:

[email protected]:/tmp/test$ ./test.sh foo 
foo is not a positive integer 

[email protected]:/tmp/test$ ./test.sh 4 

[email protected]:/tmp/test$ ./test.sh -5 
-5 is not a positive integer 
相關問題