2017-02-01 13 views
0

У меня есть переменная, значение которой я хочу передать в команду. Однако $ производит необычные результаты. Кажется, он действует как * и ищет все каталоги. Мой код:bash передавая значение в команду

"Please enter the test type: " 
read test 

result="pass" 
search_result=`find ./logs/$test_2017_01_logs*/* -type f -name func_log -exec egrep $result {} \;` 

echo "$search_result" 

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

Возникает проблема из-за конкатенации переданного значения ($ test) и остальной части имени папки (_2017_01_logs *)?

ответ

2

_ является «символом слова» ([a-zA-Z0-9_]) и понимается как часть переменной, которую вы адресуете, что является, таким образом, неопределенным $test_2017_01_logs.

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

find ./logs/"${test}_2017_01_logs"*/* -type f -name func_log -exec egrep $result {} \; 

Или, если мы будем следовать хорошо советовали советы Чарльза Даффи:

find ./logs/"$test"_2017_01_logs*/* -type f -name func_log -exec egrep -h -e "$result" /dev/null {} + 
+1

Может также добавить кавычки '$ result', так что он не получает слово-раскол (со словами, выходящими за пределы первого, которые интерпретируются как дополнительные имена файлов). –

+2

Я также предлагаю '-exec egrep -h -e '$ result"/dev/null {} + '- таким образом мы не запускаем' grep' больше времени, чем нам нужно, и (из-за предшествующий '-e') интерпретировать' result' как литеральную строку, даже если она начинается с тире. («-h» подавляет имена файлов на выходе, чтобы получить эквивалентное поведение для текущего использования, даже когда передано несколько имен, если вы хотите их, вытащите его). –

+2

... '/ dev/null' там, потому что' grep' изменяет свое поведение в некоторых случаях на основании того, сколько файлов передано; наличие этого представления гарантирует, что вы получите последовательное поведение независимо от того, сколько результатов 'find' добавляет в командную строку, и означает, что если идиома повторно используется с' xargs', мы не получаем экземпляр, читающий stdin с реализацией который следует с помощью вызова в 0-результатах, найденном (IIRC, реализация MacOS является одним из них). –

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

  • Нет связанных вопросов^_^