2011-08-20 92 views
2
if [`read -n1 -s`='y'] 

導致Bourne Shell的條件

./bzfsctl.sh:線17:[= Y]:命令未找到

即使

if [1=1] 

生產:

./bzfsctl.sh:線17:[1 = 1]:未找到命令

EDIT後在所述空間中適當添加得到

./bzfsctl.sh:線16: [:-eq:一元運算符預期

if [ `read -n1 -s` = 'y' ] 
then 
echo 'killing process ...' 
else 
echo 'Aborted' 
fi 

回答

2

你需要ŧ o小心你的命令中的空格。

if [ 1 = 1 ]; then echo Ok ; fi 
    ^^^^ 

所有這四個空間都是必需的。

如果你想讀取單個字符並對其進行測試:

read -n1 input 
if [ $input = "y" ] ; then echo Got a Yes ; fi 

當你寫if something ; then ...的shell執行something,然後根據該命令的返回碼的作用。

[不是「語法」,它是一個程序(或shell內置),也稱爲test

所以:

if [ $a = $b ] ; then ... 

實際運行的可執行文件(或內置)[的論據$a=$b]

如果您沒有放置括號,則需要將if;之間的值作爲常規可執行命令,該命令在成功時返回0。

+0

這對[1 = 1]非常有用,謝謝,不幸的是我的目標是使用: 如果[\''讀取'-n1 -s''='y']' 我得到:./bzfsctl.sh:第16行:[:-eq:一元運算符預期 – Hawken

+0

請參閱我編輯的答案。 'read ...'不會向stdout輸出任何內容,所以你的測試不能工作。 – Mat

+0

它如何工作?我現在充分的陳述是現在的問題。這是否意味着你需要一次性變量? – Hawken

0

它應該是這樣的

if [ 1 = 1 ]; then 
echo "equal"; 
else 
echo "not-equal"; 
fi 

,如果你寫爲if[1=1]那麼shell interpreter將考慮1command,所以你必須給space after [ and before ]

if [ 1 = 1 ]

希望會幫助你。

+0

謝謝,但這也與真正的字符串比較失敗。我已經更新了我的問題。 – Hawken

+0

你可以發佈實際的腳本代碼嗎? –

+0

當然,編輯主要問題 – Hawken

0

如果您搜索bash手冊頁,那麼read命令會說明它的返回值。

read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...] 


      If no names are supplied, the line read is assigned to the variable REPLY. The return code 
      is zero, unless end-of-file is encountered, read times out (in which case the return code is 
      greater than 128), or an invalid file descriptor is supplied as the argument to -u. 

所以它沒有給你任何東西來測試。你可以通過這樣的名字:

read -n 1 YesNo 
if [ $YesNo = 'Y' ] ; then 
    echo 'Yes' 
else 
    echo 'No' 
fi 

或者你可以使用內置的REPLY變量。

+0

如何獲取手冊頁供閱讀?我只是得到 概要 內建[-options] [參數...] 說明 殼牌內建命令,可以在運行 - 寧外殼的進程中執行的命令。請注意,對於csh(1)內置命令, ,如果該命令作爲除最後一個以外的管道的任何組件出現,將在子shell中執行。 – Hawken

+0

在我的系統上man read給了我bash_builtins(1)手冊頁。而男人bash給了我大量的bash手冊頁。我可以找到這兩個閱讀(雖然它需要大量的搜索)。 – Paul

+0

OS X上的BSD命令手冊只列出了沒有說明的內置命令 – Hawken