Как использовать двойные кавычки в bash вокруг каталога с пробелами

Я не знаю инструмента сравнения с такой опцией в файловом браузере, но будет интересно!

Я не знаю (до сих пор )kdiff3, я использую 'Meld' (запись 5 наhttps://www.tecmint.com/best-linux-file-diff-tools-comparison/)

Вот хороший инструмент для поиска альтернатив программному обеспечению:https://alternativeto.net/software/meld/?platform=linux

0
22.03.2021, 12:26
3 ответа

Узнайте, как переменные и кавычки работают в оболочке. Читайте о расширениях в man bash.

usbToSave="test 1 2 3"
raspistill -awb greyworld -vf -hf -o /media/pi/"$usbToSave"/test.jpg

Переменные в оболочке не являются реальными переменными, какими вы их знаете из языков программирования. Они чем-то похожи на макросы, которые расширяются до значения. Если вы не заключаете переменную в кавычки, в результате произойдет разделение слов , двойные кавычки предотвращают это.

1
28.04.2021, 22:57

Кроме того, вы можете избежать пробелов при определении переменной :Эквивалентом usbToSave="test 1 2 3"в предыдущем ответе является usbToSave=test\ 1\ 2\ 3, где символ \экранирует следующий пробел (или другой специальный символ, который может понадобиться в строке, например$)

РЕДАКТИРОВАТЬ :Я добавил двойные -кавычки и кавычки вокруг экранированной строки, чтобы было ясно, как все это работает:

$ usbToSave_A="test 1 2 3"
$ usbToSave_B=test\ 1\ 2\ 3
$ echo $usbToSave_A
test 1 2 3
$ echo $usbToSave_B
test 1 2 3
$ echo /media/pi/"$usbToSave_A"/test.jpg
/media/pi/test 1 2 3/test.jpg
$ echo /media/pi/"$usbToSave_B"/test.jpg
/media/pi/test 1 2 3/test.jpg
$ echo "/media/pi/$usbToSave_A/test.jpg"
/media/pi/test 1 2 3/test.jpg
$ echo "/media/pi/$usbToSave_B/test.jpg"
/media/pi/test 1 2 3/test.jpg

$ usbToSave_C='"test 1 2 3"'
$ usbToSave_D="test\ 1\ 2\ 3"
$ echo $usbToSave_C
"test 1 2 3"
$ echo $usbToSave_D
test\ 1\ 2\ 3
$ echo "/media/pi/$usbToSave_C/test.jpg"
/media/pi/"test 1 2 3"/test.jpg
$ echo "/media/pi/$usbToSave_D/test.jpg"
/media/pi/test\ 1\ 2\ 3/test.jpg
$ echo "/media/pi/"$usbToSave_C"/test.jpg"
/media/pi/'test 1 2 3'/test.jpg
$ echo "/media/pi/"$usbToSave_D"/test.jpg"
/media/pi/test\ 1\ 2\ 3/test.jpg

-1
28.04.2021, 22:57
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. Расширение переменной — это не замена обычного текста или расширение макроса:все, что выходит из переменной, в целом не рассматривается как синтаксис оболочки. В дополнение к кавычкам операторы оболочки, такие как &&, >, |, ;и т. д., также являются обычными символами при расширении из переменной. Разбиение слов и генерация имени файла являются единственными исключениями.

Вам нужно:

usbToSave="test 1 2 3"
raspistill -awb greyworld -vf -hf -o "/media/pi/$usbToSave/test.jpg"

То есть сделать раскрытие переменной в двойных кавычках, что предотвращает разбиение слов (и создание имени файла ).

См.:

4
28.04.2021, 22:57

Теги

Похожие вопросы