2012-11-15 311 views
1

我當前的腳本執行以下操作;Shell腳本太多if條件的參數

它將整數作爲命令行參數,從1開始到N,它檢查數字是否可以被三個,五個或兩個整除。它簡單地打印X爲三,Y爲五,XY爲三,五。如果命令行參數爲空。

我有這個錯誤「第11,15和19行太多參數」。

下面是代碼:

#!/bin/bash 

if [ (statement) ]; then 
    for ... 
    do 
     if [ statement ]; then 
      echo "s1" 
     elif [ statement2 ]; then 
      echo "s2" 
     elif [ statement3 ] 
     then 
      echo "s3" 
     else 
      echo "$i" 
     fi 
    done 
elif [ statement ] 
then 
    for ... 
    do 
     if [ statement ] 
     then 
      echo "" 
     elif [ statement2 ] 
     then 
      echo "" 
     elif [ statement3 ] 
     then 
      echo "" 
     else 
      echo "$i" 
     fi 
    done 
else 
    echo "" 
fi 

回答

6

注意[實際上是同義詞,在外殼(嘗試在終端which [)內置的test,而不是有條件的語法和其它語言一樣,所以你不能這樣做:

if [ [$i % 3] -eq 0 ]; then 

此外,始終確保至少有一個空間之間[],以及包含在betwee邏輯條件檢查的變量他們。

用於計算表達式,如模的語法是外殼由$((...))和變量名中不必由$前綴:

remainder=$((i % 3)) 
if [ $remainder -eq 0 ]; then 
+0

謝謝你,我只是倚靠'['意思是在shell中測試。我通常在它們之間放置空間,但是沒有空間也試過:) –

+0

你說變量不應該加在'$((...))'前面,但是'$(($ i%3))'和'$ ((i%3))似乎返回相同。 –

+0

在''bash''中'''是一個內建的,如'help ['所示,而不是寫在這裏的'test'命令的鏈接。 –

3

你應該使用類似:

if [ $(($i % 3)) -eq 0 ] 

而不是

if [ $i % 3 -eq 0 ] 
if [ [$i % 3] -eq 0 ] 
+0

謝謝,雖然我也嘗試過這種方法,但是我喜歡'$((i%3))'傻我。 :) –

+2

實際上,正如@sampson-chen在他的解決方案中指出的那樣,'$((i%3))'起作用。 –

1

您的腳本可以大大簡化。例如:

#!/bin/sh 

n=0 
while test $((++n)) -le ${1:-20}; do 
    t=$n 
    expr $n % 3 > /dev/null || { printf Uc; t=; } 
    expr $n % 5 > /dev/null || { printf Bes; t=; } 
    echo $t 
done 

如果參數不是整數,則會給出稍微不同的錯誤消息,但其他行爲相同。