2014-11-08 65 views
-1

我的代碼在這裏有一些問題。這是我的代碼:UNIX多個如果條件

#!bin/sh 
grep "$1" Rail.txt > test.txt 
if [ "$#" -eq 1 -a grep -q "$1" test.txt ]; then 
    grep "$1" Rail.txt 
else 
    echo not found 
fi 

問題:

它說:script.sh: line 3: [: too many arguments我每次運行它。 我不知道我的病情有什麼問題,無論我使用錯誤的操作符還是使用括號或方括號。

+0

該文件有多大? – 2014-11-08 04:52:42

回答

2

在一個半猜測,你想要寫的是:

if [ "$#" -eq 1 ] && grep -q "$1" test.txt; then 

在什麼ocassions我們應該用方括號?

在歷史上,測試命令,/bin/test是有聯繫的/bin/[,並且是外部命令,而不是外殼內置。現在(幾十年來),它一直是內置的外殼。但是,它遵循命令的結構,需要空格來分隔參數,如果它被調用爲[,那麼最後一個參數必須是]

至於當你使用它時,你需要測試一個條件時使用它。

請注意,你可以寫:

if ls; false; true; then echo "the last command counts"; else echo "no it doesn't"; fi 

if命令執行一個或多個命令序列,並測試最後一個命令的退出狀態。如果退出狀態爲0,則成功執行then子句;如果退出狀態不爲0,則採用else子句。

因此,您可以在需要測試某些東西時使用該測試。它可以是ifelifwhile(或until)的一部分。它也可以對自己使用||&&

[ -z "$1" ] && echo "No arguments - or the first argument is an empty string" 

[ "$var1" -gt "$var2" ] || echo "Oops!" && exit 1 

這些可以寫成if陳述過,當然:

if [ -z "$1" ] 
then echo "No arguments - or the first argument is an empty string" 
fi 

if [ "$var1" -le "$var2" ] 
then 
    echo "Oops!" 
    exit 1 
fi 

注意,我需要反轉測試在第二改寫。 Bash有一個內置的!運營商用於反轉下面的命令的退出狀態,所以我還可以這樣寫:

if ! [ "$var1" -gt "$var2" ] 

test!太多,所以它也可以寫成:

if [ ! "$var1" -gt "$var2" ] 
+0

太過於字面上'多年的經驗'。 – 2014-11-08 05:25:41

+0

我們應該使用方括號嗎? – 2014-11-08 07:01:39