2013-05-09 5 views
5

Wynik jest pusty z poniższego skryptu. Czego mu brakuje? Próbuję grep ciągSkrypt powłoki grep do grep a string

#!/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

Dlaczego liczba #! linia powiedzieć ksh? – jman

+1

Jaka jest wartość 'file'? Podejrzewam, że możesz mieć problem z RHS tego zadania. – chepner

Odpowiedz

9

W bash użyj <<< przekierowanie z ciągu (a 'Here string'):

if grep -q abc_def_APP <<< $file 

w innych powłokach, może trzeba użyć:

if echo $file | grep -q abc_def_APP 

Umieszczam mój then w następnym wierszu; jeśli chcesz, aby Twój numer then był w tej samej linii, dodaj po tym, co napisałem, ; then.


Zauważ, że to zadanie:

file=$abc_def_APP_13.4.5.2 

jest dość dziwne; przyjmuje wartość zmiennej środowiskowej ${abc_def_APP_13} i dodaje .4.5.2 do końca (musi to być env var, ponieważ możemy zobaczyć początek skryptu). Prawdopodobnie zamierzał napisać:

file=abc_def_APP_13.4.5.2 

W ogóle, należy załączyć referencje do zmiennych posiadających nazwy plików w cudzysłów, aby uniknąć problemów ze spacjami itp w nazwach plików. Nie jest to tutaj istotne, ale dobre praktyki to dobre praktyki:

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

Jeśli używam 'if echo $ file | grep -q abc_def_APP' drukuje zawartość pliku $, którego nie chcę do – Jill448

+0

Wybrałeś opcję '-q', aby uruchomić' grep' w trybie 'cichym' (za [POSIX] (http: // pubs .opengroup.org/onlinepubs/9699919799/utilities/grep.html)); nie powinien niczego wyprowadzać. Jeśli twoja wersja 'grep' ma inne rozumienie' -q', będziesz musiał spojrzeć na swoją stronę man 'grep' lub przekierować do'/dev/null'. –

+0

Pierwszy zadziałał. 'if grep -q abc_def_APP <<< $ file' – Jill448

3

Fuj! Użyj ciągi powłoki odpowiadającej

+0

czy nie ryzykujesz dopasowania wielu plików' * abc_def_APP * 'i zrujnujesz warunek w procesie? Co jeśli '$ plik' jest' abc_def_APP1' i '* abc_def_APP *' rozwinięty na 'abc_def_APP1 abc_def_APP2', warunek zostanie oceniony jako fałszywy. – Anthony

+0

i o "Fuj!" część; Całkowicie się z tobą zgadzam! cała powłoka poleceń uniksowych (typu unix) jest obrzydliwa ... ale bez niej nie możesz żyć, prawda? – Anthony

+0

Wewnątrz podwójnych nawiasów dopasowujemy wzorce do lewego ciągu znaków, nie pasując do nazw plików. –