Bash
如何在帶有空格的目錄周圍的bash中使用雙引號
我正在研究樹莓派(Raspberry Pi OS):
我執行一個 Bash
#!/bin/bash
腳本,我需要將文件(拍攝的照片)保存在名稱中包含空格的目錄下。在我的情況下,目錄是:
/media/pi/test 1 2 3
我執行並執行我想要的命令:
raspistill -awb greyworld -vf -hf -o /media/pi/"test 1 2 3"/test.jpg
拍照並保存在那裡,效果很好。
我的問題是,我希望“test 1 2 3”在變數中,如下所示:
usbToSave="\"test 1 2 3\"" #usbToSave is now "test 1 2 3" raspistill -awb greyworld -vf -hf -o /media/pi/$usbToSave/test.jpg
但是上面會拋出這個錯誤:
Invalid command line option (1)
我不明白為什麼。我確信這樣的事情已經在論壇的某個地方得到了回答,但我找不到它。我想我沒有使用正確的關鍵字來搜尋它。
筆記:
如果,我的目錄沒有空格,例如
/media/pi/test
Bash 腳本:usbToSave="test" raspistill -awb greyworld -vf -hf -o /media/pi/$usbToSave/test.jpg
工作沒有錯誤。
了解變數和引用如何在 shell 中工作。閱讀. _ _
man bash
usbToSave="test 1 2 3" raspistill -awb greyworld -vf -hf -o /media/pi/"$usbToSave"/test.jpg
shell 中的變數不是真正的變數,正如您從程式語言中所知道的那樣。它們在某種程度上類似於擴展為值的宏。如果你不引用變數,結果會發生分詞,雙引號會防止這種情況發生。
usbToSave="\"test 1 2 3\"" raspistill -awb greyworld -vf -hf -o /media/pi/$usbToSave/test.jpg
在這裡,您將引號放入變數的值中,賦值後,它將包含
"test 1 2 3"
. 然後,您在沒有雙引號的情況下擴展變數,遇到了分詞的問題(請參見下面的連結)。結果是raspistill
得到/media/pi/"test
,1
,2
, 和3"/test.jpg
作為不同的命令行參數。請注意,您放在變數中的引號是結果單詞中的文字,即
raspistill
. 變數擴展不是純文字替換或宏擴展:從變數中產生的任何內容通常都不會被視為 shell 語法。除了引號之外,shell 運算符(如&&
,>
,|
等;
)在從變數擴展時也只是正常字元。分詞和文件名生成是這裡唯一的例外。你需要做的是:
usbToSave="test 1 2 3" raspistill -awb greyworld -vf -hf -o "/media/pi/$usbToSave/test.jpg"
也就是說,在雙引號內進行變數擴展,這可以防止分詞(和文件名生成)。
看: