1

Я пытаюсь присвоить вывод команды basename файла переменной "filename". paths - это файл, который содержит путь, например, /root/home/david/mynote

$FILE is = mynote . grep - получить полный путь /root/home/david/mynote а basename - извлечь только mynote и назначить его переменной filename .

filename=basename `grep $FILE House/paths`

В приведенной выше командной строке значение имени filename всегда пусто, когда я ввожу echo $filename .

2 ответа2

2

В общем, в BASH вы сохраняете вывод команд в переменную одним из следующих способов:

foo=$(ls /usr)

или же

foo=`ls /usr`

Что касается вашего вопроса, если у вас есть файл с именем foo.txt , содержимое которого выглядит так:

/usr/
/usr/games
/usr/games/cowthink
/usr/games/cowsay
/usr/games/fortune
/usr/games/enemylines7
/usr/games/enemylines3
/usr/lib32
/usr/lib32/libgdbm_compat.so.3.0.0
/usr/lib32/libfusion-1.2.so.9.0.1

тогда это должно делать то, что вам нужно:

while read FILE; do filename=`basename "$FILE"`; echo "$filename"; done < foo.txt

Если вместо этого вы хотите выполнить поиск определенного шаблона (например, "mynote") в файле, выполните:

grep mynote foo.txt|while read FILE; do filename=`basename "$FILE"`; echo "$filename"; done

ОБЪЯСНЕНИЕ:

while read FILE; do {something}; done < foo.txt

Эта команда читает каждую строку файла foo.txt и сохраняет его содержимое в переменной $FILE . Затем он выполняет {something} один раз для каждой строки файла.

В этом случае {something} является этой командой:

filename=`basename "$FILE"`; echo "$filename"  

Он запускает basename для содержимого переменной $FILE и сохраняет результат в переменной $filename . Обратите внимание на кавычки (") вокруг $FILE , они гарантируют, что команда работает для имен файлов, содержащих пробелы. Наконец, он использует echo для печати содержимого $filename .


ОБНОВИТЬ:

Увидев ваш другой вопрос, я понимаю, что вы пытаетесь сделать. Что вам нужно, это:

filename=$(basename `grep $FILE CourseWork/paths`) 
2

Это прекрасный пример, почему вы должны прекратить использовать устаревший синтаксис backtick в bash:

filename=$(basename $(grep $FILE House/paths))

См. Http://www.gnu.org/software/bash/manual/bashref.html#Command-Substitution

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

filename=$(basename "$(grep "$FILE" House/paths)")

Причина, по которой переменная пуста, заключается в следующем: когда оболочка видит

filename=basename `grep $FILE House/paths`
  1. оболочка сначала выполняет команду grep (предположим, для иллюстрации команда возвращает "/foo/bar/myfile")
  2. Затем оболочка пытается выполнить «/foo/bar/myfile», временно устанавливая переменную окружения filename со значением baseline для продолжительности этой команды - оболочка не содержит переменную filename .

Это спокойно задокументировано в справочнике bash в разделе Environment

Среду для любой простой команды или функции можно временно дополнить, добавив к ней префиксы с помощью параметров, как описано в разделе Параметры оболочки. Эти операторы присваивания влияют только на среду, видимую этой командой.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .