2013-07-19 2 views
1

Я пишу Баш скрипт, который содержал команду, аналогичную:шаблон соответствия в строке

echo Configure with --with-foo=\"/tmp/foo-*\" 

Я хотел эту команду для получения вывода, такие как:

Configure with --with-foo="/tmp/foo-1.3.2" 

но модель WASN» t расширен, потому что он был встроен в строку. Я получил его на работу, используя подстановку команды:

echo Configure with --with-foo=\"$(echo /tmp/foo-*)\" 

Я думаю, что это стандартное/бен/ш решение, но Баш поддерживает решение, которое не требует раздваивание подоболочку, таким же образом, что $((6 * 7)) можно использовать вместо $(expr 6 \* 7)? Кроме того, есть ли способ ограничить результат одним совпадением?

+2

Пожалуй 'printf 'Настроить с помощью -foo = \"% s \ "\ n"/tmp/foo- * '? Хотя вся идея кажется немного хрупкой, потому что '/ tmp/foo- *' может не совпадать ни с чем, или более чем с одной, что может привести к нечетным проблемам ... – twalberg

+0

@twalberg Должно быть ровно одно совпадение, если все хорошо , поэтому я бы действительно хотел создать ошибку, если ее нет. –

+0

Да, это «если все не хорошо», о чем я говорил, поэтому вам может понадобиться некоторая логика перед 'printf', чтобы убедиться, что все действительно ... – twalberg

ответ

1

Чтобы проверить, сколько файлов ваш шаблон расширяется в, хранить разложение в массив, прежде чем использовать его

shopt -s nullglob 
foo=(/tmp/foo-*) 
if ((${#foo[@]} == 0)); then echo "no foo files" 
elif ((${#foo[@]} > 1)); then echo "too many foo files" 
else do something with "${foo[0]}" 
fi 
1

Как альтернатива, используйте for петлю и break после первой итерации:

shopt -s nullglob 
for f in /tmp/foo-*; do 
    echo "Configure with --with-foo=\"$f\"" 
    break 
done 
+0

Обратите внимание, что это зависит от bash' nullglob': если он не установлен, то f будет ''/tmp/foo - * ''- добавить' shopt -s nullglob' –

+0

@glennjackman: Спасибо. Добавлено в ответ. – Birei

Смежные вопросы