2017-09-12 200 views
0

所以我想弄清楚這個奇怪的行爲。用雙引號執行Linux命令

$ hello hello   
-ksh: hello: not found [No such file or directory] 
$ "hello hello" 
-ksh: hello hello: not found [No such file or directory] 
$ echo hello hello 
hello hello 
$ `echo hello hello` 
-ksh: hello: not found [No such file or directory] 
$ echo \"hello hello\" 
"hello hello" 
$ `echo \"hello hello\"` 
-ksh: "hello: not found [No such file or directory] 

第2和第6條命令與我的問題最相關。如果我運行第二個命令"hello hello",那麼它將評估這是一個大的參數。但是,如果我嘗試運行最後一條命令,那麼它應該具有相同的行爲嗎?

`echo \"hello hello\"` 

那麼它應該具有相同的行爲?但它看到"hello作爲它自己的獨立詞彙。有人可以解釋這一點,以及如何讓第六條命令像第二條命令一樣工作,從而將「hello hello」評估爲一個整體陳述?

(這有一個更實際的應用,但這是我可以生產的最小的例子)。

預先感謝您!

編輯:我看到我得到了一個downvote,所以我會更具體地說明我遇到了什麼問題。

rcli4 6379 keys AAA* | sed -e "s/.*/'&'/" | while read line; do rcli4 6379 get $line; done 

注意rcli4只是爲redis-cli -p的別名。我不斷收到

(error) ERR wrong number of arguments for 'get' command 

這是由於引號被錯誤地解析。我嘗試過不同的組合,比如添加更多引號,刪除sed語句等,但是我認爲能夠解決我最初的問候問題會給我足夠的關於如何解決我的具體問題的見解。

+0

'ksh'不是'bash',你可能需要修復你的標籤或你的shell –

+1

在一個帶引號的字符串中,一個引號只是另一個字符。它沒有特殊的力量。 – John1024

+0

@EricRenouf哎呀!謝謝 –

回答

1

在帶引號的字符串中,引號只是另一個字符。它沒有特殊的力量。

如果我正確地理解了編輯中說明的問題,解決方法是在之內引用$linedo-loop,而不是在它之前。因此,嘗試:

rcli4 6379 keys 'AAA*' | while read -r line; do rcli4 6379 get "$line"; done 

沒有雙引號$line,外殼將上line內容進行分詞路徑擴展。你也不想要。雙引號抑制了兩者。

此外,我們增加了-r選項read。這可以防止readline的內容進行反斜槓處理。

最後,我們在數據庫密鑰glob AAA*周圍放置單引號。如果沒有引號,shell會將AAA*解釋爲文件全局,並將對其執行路徑名擴展。如果碰巧存在與當前目錄匹配的文件,則結果將是意想不到的和不需要的。如果設置了bash選項nullglob,則不管當前目錄中的文件是什麼,結果都不是你想要的。