[+] warunek if w po

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
sector
Beginner
Posty: 113
Rejestracja: 28 kwietnia 2010, 10:48
Lokalizacja: Kraków

[+] warunek if w połączeniu z grep nie działa

Post autor: sector »

Znalazłem w internecie taki przykład działania ,,if'' z grepem:

Kod: Zaznacz cały

if grep -q co plik1.txt
  echo "OK"
else
  echo "FAIL!"
fi
Na tej podstawie zrobiłem sobie coś takiego:

Kod: Zaznacz cały

root=/home/sector/Desktop/berberis/code/
temp=/home/sector/ls.txt


ls -l ${root} | awk '{print $8}' >>  ${temp}
lista=`cat ${temp}`

for loop in ${lista}
do
  if grep -q TSQLQuery ${root}${loop}  
  then
  echo "TSQLQuery OK!"
#      echo ${loop} >> /home/sector/Desktop/pliki.txt
    if grep -q SQLQueryEx ${root}${loop} 
    then
      echo "SQLQueryEx OK!"
    else    
      sed 's/SqlExpr,/SqlExpr, SQLQueryEx,/' ${root}${loop} >> ${root}${loop}.bak
      mv ${root}${loop}.bak ${root}${loop}
      echo "SQLQueryEx FAIL!"
    fi   
    sed 's/TSQLQuery/TSQLQueryEx/' ${root}${loop} >> ${root}${loop}.bak
    mv ${root}${loop}.bak ${root}${loop}
  else echo "TSQLQuery FAIL!"
  fi
done
Mimo tego, że w pliku 1 znajduje się słowo ,,TSQLQuery'' oraz ,,SQLQueryEx'' to konsola pokazuje mi coś takiego:

Kod: Zaznacz cały

sector@debian:~/Desktop$ ./sed2.sh 
TSQLQuery FAIL!
TSQLQuery OK!
SQLQueryEx OK!
Może mi ktoś z tym pomóc?
Awatar użytkownika
Redhead
Junior Member
Posty: 526
Rejestracja: 17 lipca 2007, 17:37

Post autor: Redhead »

sector pisze:Znalazłem w internecie taki przykład działania ,,if'' z grepem:

Kod: Zaznacz cały

if grep -q co plik1.txt
  echo "OK"
else
  echo "FAIL!"
fi
Tak na szybko.

Kod: Zaznacz cały

if [[ `grep -q co plik1.txt;echo $?` == 0 ]] 
then
echo "OK" 
else
echo "FAIL!"
fi
Awatar użytkownika
sector
Beginner
Posty: 113
Rejestracja: 28 kwietnia 2010, 10:48
Lokalizacja: Kraków

Post autor: sector »

Działa, dziękuję.
enz
Posty: 12
Rejestracja: 30 lipca 2009, 17:16

Post autor: enz »

@Redhead
Niepotrzebnie porównałeś kod wyjścia grepa. Składnia polecenia if nie wymaga użycia nawiasów: http://mywiki.wooledge.org/BashPitfalls ... _myfile.5D


Do porównywania liczb używa się "(( i ))", nie [[ i ]]. Za pomocą [[ i ]] porównuje się łańcuchy tekstowe.

@sector
Po pierwsze, zawsze cytuj zmienne podczas wykonywania operacji na plikach:

Kod: Zaznacz cały

mv $foo $bar # źle
mv "$foo" "$bar" # dobrze
http://mywiki.wooledge.org/BashPitfalls ... _.24target


Po drugie, nie należy używać polecenia ls do wyciągania listy plików w skryptach: http://mywiki.wooledge.org/BashPitfalls ... .2A.mp3.60


Oprócz tego, zazwyczaj lepiej jest używać "$()" zamiast "``": http://mywiki.wooledge.org/BashFAQ/082

Kod: Zaznacz cały

#!/bin/bash
root=${HOME}/Desktop/berberis/code

for file in "${root}/"*;do
	if grep -q TSQLQuery "${root}/${file}";then
		echo "TSQLQuery OK!"
		if grep -q SQLQueryEx "${root}/${file}";then
			echo "SQLQueryEx OK!"
    	else
			sed 's/SqlExpr,/SqlExpr, SQLQueryEx,/' "${root}/${file}" > "${root}/${file}"
			echo "SQLQueryEx FAIL!"
		fi
		sed 's/TSQLQuery/TSQLQueryEx/' "${root}/${file}" > "${root}/${file}"
	else
		echo "TSQLQuery FAIL!"
	fi
done
Czy ten kod działa poprawnie?
ODPOWIEDZ