Bash экранировать специальные символы

Я синхронизирую каталоги. используя следующее.

source_location='/pi/data/2018/image_*.png'
echo $source_location;

Печать /pi/data/2018/image_*.png

mydate=$(date +'%Y');
source_location='/pi/data/$mydate/image_*.png'

Печатает /pi/data/2018/image_1.png /pi/data/2018/image_2.png /pi/data/2018/image_3.png и т. д.

Как мне избежать * или есть способ лучше?

source_location='/pi/data/'$(date +'%Y')'/image_*.png'
anubhava 17.12.2018 18:04

1. каков ваш желаемый результат? 2. echo $ source_location во втором варианте не распечатает то, что вы сказали.

jeremysprofile 17.12.2018 18:04

Я предполагал, что вторая строка будет выводить /pi/data/2018/image_*.png точно так же, как первая строка.

user3525290 17.12.2018 18:05

@ user3525290: Что вы пытаетесь сделать? Каков ваш ожидаемый результат? Сделайте ваш запрос более понятным.

User123 17.12.2018 18:32

Мой ожидаемый результат совпадал бы с обеими строками печати. когда я использую source_location = "/pi/data/$mydate/image_*.png", распечатка source_location печатает все мои файлы в каталоге /pi/data/2018/image_1.png /pi/data/2018/image_2.png /pi/data/2018/image_3.png вместо того, чтобы просто печатать текст /pi/data/2018/image_*.png

user3525290 17.12.2018 18:36

Отредактируйте свой вопрос и проверьте, помогает ли это: source_location=$(ls /pi/data/${mydate}/image_*.png) && echo $source_location

User123 17.12.2018 18:40

Расширения параметров без кавычек подлежат раскрытию имени пути. Я не понимаю, как ваш пример первый может дать результат, о котором вы заявляете.

chepner 17.12.2018 19:07

В любом случае declare -p source_location или printf 'source_location=%q\n' "$source_location" будут более информативными в отношении содержимого переменной. Даже Спецификация POSIX для echo не рекомендует его использовать (см. Разделы ИСПОЛЬЗОВАНИЕ ПРИЛОЖЕНИЯ и ОБОСНОВАНИЕ).

Charles Duffy 17.12.2018 19:09
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
46
2

Ответы 2

Одиночные кавычки не допускают интерполяции. Двойные кавычки делают.

$: touch /pi/data/2018/image_foo.png           # create a file
$: touch /pi/data/2018/image_bar.png           # create a file
$: source_location='/pi/data/2018/image_*.png' # a single-quoted literal
$: echo '$source_location'                     # a single-quoted literal
$source_location
$: echo "$source_location"                     # a double-quoted variable
/pi/data/2018/image_*.png
$: echo $source_location                       # unquoted variable, parsed before passed to echo
/pi/data/2018/image_foo.png /pi/data/2018/image_bar.png

$: mydate=$(date +'%Y');
$: source_location='/pi/data/$mydate/image_*.png' # a single-quoted literal
$: echo '$source_location'                        # a single-quoted literal
$source_location
$: echo "$source_location"                        # a double-quoted variable containing a single-quoted literal
/pi/data/$mydate/image_*.png
$: source_location = "/pi/data/$mydate/image_*.png" # a double-quoted variable
$: echo "$source_location"                        # a double-quoted variable containing a double-quoted variable
/pi/data/2018/image_*.png
$: echo $source_location                       # unquoted variable, parsed before passed to echo
/pi/data/2018/image_foo.png /pi/data/2018/image_bar.png

Может быть, вам стоит задать более полный вопрос о том, что вы пытаетесь выполнить с тем, что вы пробовали. Кроме того, прежде чем это делать, поищите на сайте - вероятно, есть много релевантных вопросов.

Я пробовал этот source_location='/pi/data/$mydate/image_*.png' печатает /pi/data/$mydate/image_*.png.

user3525290 17.12.2018 18:29

@ user3525290 не следует использовать одинарные кавычки, если вы хотите подстановки в тексте; используйте двойные. Или, может быть, попробуйте построить свой текст поэтапно.

linuxfan says Reinstate Monica 17.12.2018 18:43

Я тоже не понимаю bash, и, возможно, в этом проблема. Для меня, если я использую source_location='/pi/data/2018/image_*.png' и печатаю это на экране, он печатает /pi/data/2018/image_*.png, но когда я ввожу переменную /pi/data/$mydate/image_*.png, он расширяется и печатает все каталоги /pi/data/2018/image_21*.png /pi/data/2018/image_2*.png etc

user3525290 17.12.2018 18:49

Поведение echo $source_location без кавычек зависит от того, действительно ли этот глобус будет соответствовать каким-либо файлам в системе, где проводился этот тест - поведение, которое довольно важно раскрывать и обсуждать при любом обсуждении вопроса.

Charles Duffy 17.12.2018 19:04

На самом деле просто скопировал / вставил эту строку как шаблон, не глядя на нее. Ты совершенно прав. Цитировал их.

Paul Hodges 18.12.2018 15:20

Если вы хотите сохранить серию имен файлов из расширения glob, используйте массив:

mydate=$(date +'%Y');
source_location=( "/pi/data/$mydate/image_"*.png )
echo "The first file is ${source_location[0]}"
echo "All files are: " "${source_location[@]}"

Другие вопросы по теме