Я синхронизирую каталоги. используя следующее.
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
и т. д.
Как мне избежать *
или есть способ лучше?
1. каков ваш желаемый результат? 2. echo $ source_location во втором варианте не распечатает то, что вы сказали.
Я предполагал, что вторая строка будет выводить /pi/data/2018/image_*.png
точно так же, как первая строка.
@ user3525290: Что вы пытаетесь сделать? Каков ваш ожидаемый результат? Сделайте ваш запрос более понятным.
Мой ожидаемый результат совпадал бы с обеими строками печати. когда я использую 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
Отредактируйте свой вопрос и проверьте, помогает ли это: source_location=$(ls /pi/data/${mydate}/image_*.png) && echo $source_location
Расширения параметров без кавычек подлежат раскрытию имени пути. Я не понимаю, как ваш пример первый может дать результат, о котором вы заявляете.
В любом случае declare -p source_location
или printf 'source_location=%q\n' "$source_location"
будут более информативными в отношении содержимого переменной. Даже Спецификация POSIX для echo
не рекомендует его использовать (см. Разделы ИСПОЛЬЗОВАНИЕ ПРИЛОЖЕНИЯ и ОБОСНОВАНИЕ).
Одиночные кавычки не допускают интерполяции. Двойные кавычки делают.
$: 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 не следует использовать одинарные кавычки, если вы хотите подстановки в тексте; используйте двойные. Или, может быть, попробуйте построить свой текст поэтапно.
Я тоже не понимаю 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
Поведение echo $source_location
без кавычек зависит от того, действительно ли этот глобус будет соответствовать каким-либо файлам в системе, где проводился этот тест - поведение, которое довольно важно раскрывать и обсуждать при любом обсуждении вопроса.
На самом деле просто скопировал / вставил эту строку как шаблон, не глядя на нее. Ты совершенно прав. Цитировал их.
Если вы хотите сохранить серию имен файлов из расширения 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[@]}"
source_location='/pi/data/'$(date +'%Y')'/image_*.png'