Bash

如何在帶有空格的目錄周圍的bash中使用雙引號

  • March 22, 2021

我正在研究樹莓派(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/testBash 腳本:

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"

也就是說,在雙引號內進行變數擴展,這可以防止分詞(和文件名生成)。

看:

引用自:https://unix.stackexchange.com/questions/640460