2016-11-15 49 views
2

我正在寫一個簡單的代碼,輸出以00開頭的目錄中的子目錄數。這裏是我的代碼:[:-le:一元運算符預計

#!/bin/bash 

maxout=2 

function getnumber { 
    number=`ls | grep 00 | wc -l` 
    return $number 
} 

qs=`getnumber` 
echo $qs 
if [ $qs -le $maxout ] 
    then 
     echo 'Youpiiii !!!' 
else 
    echo 'Sleeping for 60 sec' 
fi 

不過,我得到以下錯誤 [: -le: unary operator expected

當我trace我的代碼,該功能正在工作。我有

++ return 5 

+ qs= 

我在做什麼錯?

+1

如果你引述你的擴展('[「$ qs」-le「$ maxout」]'),你會得到一個更明智的錯誤信息。現在,你的代碼試圖運行像'[-le 2]'這樣的東西,事實上,這是無效的。 ''''-le 2]',因爲調用會引用正確的引用,會使'test'命令發出更正確的錯誤。 –

+0

......另一方面,考慮使用'getnumber(){',而不是'函數getnumber {'。前者的語法符合POSIX標準,因此可以使用'/ bin/sh';後者是bashism,但是(與許多實際上增加價值的其他bashisms不同)對便攜式語法沒有任何好處。 –

+1

另一方面,[不要試圖解析'ls']的輸出(http://mywiki.wooledge.org/ParsingLs)。如果你想計算其名稱中包含'00'的文件的數量,那麼它可能會看起來像這樣:'getnumber()(shopt -s nullglob; set - * 00 *; echo「$#」)' - - 只產生一個子進程,這是一個子shell'fork()',沒有'execve'關閉;與原始代碼相比,它產生了一個子shell,然後從該子shell產生三個,一個到'exec',每個'ls','grep'和'wc'。 –

回答

3

`...`符號捕獲什麼...打印,沒有什麼回報。 (return主要是爲表明成功與失敗)

因此,改變這種:

number=`ls | grep 00 | wc -l` 
return $number 

這樣:

number=`ls | grep 00 | wc -l` 
echo $number 

或者只是:

ls | grep 00 | wc -l 
+0

當然更爲正確,但我認爲在理想的世界中,我們會勸阻OP使用外部工具*來完成某些工作,而shell可以單獨完成內建工作。 –

+0

那麼如何將函數的輸出分配給一個變量?我不習慣在bash中編碼。這是我如何在python中完成的。謝謝! – aloha

+1

@aloha:您已經正確捕獲輸出;它只是通過'echo'和'printf'等來填充輸出,而不是通過'return'。如果你想要的是退出狀態(這是'return'設置的),那麼你可以在命令完成後檢查'$?'變量的值。但是這不適用於你的問題中描述的情況。 – ruakh