2013-05-09 3 views
5

Выходной код пуст в следующем скрипте. Что ему не хватает? Я пытаюсь Grep строкусценарий оболочки grep для grep строки

#!/bin/ksh  
file=$abc_def_APP_13.4.5.2  
if grep -q abc_def_APP $file; then 
echo "File Found" 
else 
echo "File not Found" 
fi 
+2

Почему #! line say ksh? – jman

+1

Какова ценность 'файла'? Я подозреваю, что у вас может быть проблема с RHS этого задания. – chepner

ответ

9

В bash, используйте <<< перенаправление из строки (а 'Here string'):

if grep -q abc_def_APP <<< $file 

В других оболочках, возможно, потребуется использовать:

if echo $file | grep -q abc_def_APP 

Я положил свой then на следующей строке; если вы хотите, чтобы ваш then в той же строке, а затем добавьте ; then после того, что я написал.


Обратите внимание, что это назначение:

file=$abc_def_APP_13.4.5.2 

довольно странным; он принимает значение переменной окружения ${abc_def_APP_13} и добавляет .4.5.2 до конца (он должен быть env var, так как мы можем видеть начало скрипта). Вы, вероятно, намеревался написать:

file=abc_def_APP_13.4.5.2 

В общем, вы должны приложить ссылки переменных, содержащих имена файлов в двойные кавычки, чтобы избежать проблем с пробелами и т.д. в именах файлов. Это не имеет особого значения, но эффективная практика является хорошей практикой:

if grep -q abc_def_APP <<< "$file" 
if echo "$file" | grep -q abc_def_APP 
+0

Если я использую 'if echo $ file | grep -q abc_def_APP', он печатает содержимое файла $, которое я не хочу использовать – Jill448

+0

Вы выбрали опцию '-q', чтобы make' grep' запускался в режиме «тихий» (за [POSIX] (http: // пабы) .opengroup.org/onlinepubs/9699919799/утилиты/grep.html)); он ничего не должен выводить. Если ваша версия 'grep' имеет другое представление о' -q', вам нужно будет просмотреть man-страницу вашего man 'grep' или перенаправить на'/dev/null'. –

+0

Первый работал. 'if grep -q abc_def_APP <<< $ file' – Jill448

3

Yuck! Используйте соответствие строки оболочки

if [[ "$file" == *abc_def_APP* ]]; then ... 
+0

Не рискуете ли вы сопоставить несколько файлов с' * abc_def_APP *' и разрушить условие в процессе? Что, если '$ file'' 'abc_def_APP1' и' * abc_def_APP * 'расширена до 'abc_def_APP1 abc_def_APP2', условие будет оцениваться как false. – Anthony

+0

и про "Yuck!" часть ; Я полностью с тобой согласен! вся unix (unix-like) командная оболочка отвратительна ... но вы не можете жить без нее, не так ли? – Anthony

+0

Внутри двойных скобок мы сопоставляем шаблон с левой строкой, а не с именами файлов. –

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