1

Я изо всех сил пытаюсь найти способ выразить это каким-то другим способом, который даст соответствующий результат:

var="$(ls /var/run/ | grep searchterm | awk {'NR == 2'})"

Я видел в таких местах, как shellcheck, использование glob или loop, но мои исследования до сих пор не нашли ничего, что могло бы сделать это, чтобы я мог получить результат в виде переменной, а не просто отображать или выводить содержимое.

Есть ли способы сделать это?

2 ответа2

0

Если ваша ситуация

В каталоге четыре файла - три имеют статические имена (например, red , blue и green), а один - нет.  Но я знаю, что у четвертого будет имя foo .  Я хочу получить это четвертое имя файла.  Очевидно, что я могу безопасно искать foo , потому что ни одно из статических имен не содержит foo .

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

var="$(echo /var/run/*foo*)"

Если вы просто работаете в текущем каталоге, и вы делаете

var="$(echo *foo*)"

и четвертое имя файла может начинаться с - (тире), выше может произойти сбой.  (Кроме того, любая из приведенных выше команд может завершиться ошибкой, если имя файла может содержать \ (обратную косую черту).)  Но

var="$(printf '%s' *foo*)"

или же

var="$(printf '%s' /var/run/*foo*)"

должно сработать.

Конечно, если четвертое имя файла может начинаться с . (точка), у вас есть другая проблема.

0
var="$( find /var/run -iregex "$YOUR_REGEX" 2> /dev/null )"

Конечно, man find может узнать некоторые ограничения опции -iregex .

Если searchterm не слишком сложен, вы можете использовать -iname "*$SEARCHTERM*" .

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

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