Echo и * [РЕШЕНО] (запретить echo разворачивать пути)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Novascriptum
Сообщения: 40

Echo и * [РЕШЕНО]

Сообщение Novascriptum »

Рассмотрим гипотетический bash-скрипт:

Код: Выделить всё

cd /path/ty/my/dir
TESTVAR="subdir1/*,subdir2/*"
ITEMS=$(echo $TESTVAR  | tr "," "\n")
echo $ITEMS

Пусть в папке /path/ty/my/dir есть подпапки subdir1 и subdir2, и в них, в свою очередь, лежат какие-то папки и файлы.
В таком случае этот код вернет список всех этих папок и файлов (внутри subdir1 и subdir2), т.е. система как бы раскроет все пути по паттерну "subdir1/*" и "subdir2/*", а мне этого не хотелось бы, нужен такой результат:

Код: Выделить всё

subdir1/*
subdir2/*


Как это сделать? Пока у меня это получается только путем выхода из текущей папки (например, cd /), но не хотелось бы прибегать к этому решению. Соответственно, раз в данной папке нет таких подпапок, шаблоны не раскрываются.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Echo и * [РЕШЕНО]

Сообщение drBatty »

ничего не раскроет

попробуйте. Звёздочка только одна раскрывается, а с запятой из переменно не раскрывается

$

$ X="*,"; echo $X *,



А вообще говоря, надо переменный в echo в кавычки заключать, что-бы они не раскрывались. Тогда tr будет работать правильно и с одной звёздочкой

$

$ X="*"; echo "$X" *


http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Novascriptum
Сообщения: 40

Re: Echo и * [РЕШЕНО]

Сообщение Novascriptum »

drBatty, это все понятно и правильно, что вы говорите для общего случая. Но вот обнаружил еще один неприятный частный момент, связанный с перебором в цикле:

root

#!/bin/sh cd /path/ty/my/dir TESTVAR="subdir1/*,subdir2/*" ITEMS=$(echo $TESTVAR | tr "," "\n") for ITEM in $ITEMS do echo $ITEM done


В цикле каждый ITEM будет уже раскрытым шаблоном, т.е. конкретным файлом или папкой, подходящим под шаблон. А мне этого не нужно.
Пробовал писать после строки

root

ITEMS=$(echo $TESTVAR | tr "," "\n")


строку

root

ITEMS=$(echo "$ITEMS")


...но не помогает

И заключение в кавычки "$TESTVAR" тоже не помогает:

root

ITEMS=$(echo "$TESTVAR" | tr "," "\n")

Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: Echo и * [РЕШЕНО]

Сообщение /dev/random »

Можно так:

Код: Выделить всё

#!/bin/sh
cd /path/ty/my/dir
TESTVAR="subdir1/*,subdir2/*"
ITEMS=$(echo "$TESTVAR"  | tr "," "\n")
set -f
for ITEM in $ITEMS
do
    echo "$ITEM"
done
set +f
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Echo и * [РЕШЕНО]

Сообщение drBatty »

Novascriptum писал(а):
25.12.2013 17:28
...но не помогает

ну дык вставте отладочную печать. Всё там помогает, у вас просто в каждой строке ошибка. Вот /dev/random уже дал годный вариант. Сравните со своим.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Ответить