Es wird davon ausgegangen, dass die folgenden zwei txt-Dateien im selben Verzeichnis gespeichert sind.
hoge.txt
hoge hoge
fuga.txt
fuga fuga
Verwenden Sie eval, um Zeichenfolgen anstelle einfacher Zeichenfolgen auszuwerten und zu verketten. Ich werde die Erklärung der Grundfunktionen von eval weglassen.
example.sh
#!/bin/bash
value='hoge'
#Speichern Sie den Befehl als Zeichenfolge in einer Variablen
#Fälle, in denen Befehle als Zeichenfolgen für Funktionen in bash angegeben werden,
#Angenommen, ein Befehl wird als Zeichenfolge aus einer Datei gelesen
cmd='grep $value hoge.txt'
echo $cmd
#Ausgabe-> grep $value hoge.txt
#Im Falle eines Echos wird der Befehl nicht ausgeführt.Variablen werden nicht erweitert und als Zeichenfolgen ausgegeben
eval $cmd
#Ausgabe-> hoge hoge
#Bei eval wird die Variable erweitert und der Befehl ausgeführt.
Ausführungsergebnis
$ ./example.sh
grep $value hoge.txt
hoge hoge
success.sh
#!/bin/bash
#Führen Sie grep für die txt-Datei im selben Verzeichnis aus,Wenn ein Suchmuster gefunden wird,Funktion zur Ausgabe einer Nachricht.
#Suchmuster als erstes Argument,Übergeben Sie die auszugebende Nachricht an das zweite Argument
grep_text() {
for txt_file in $(ls . | grep ".txt$"); do
grep_result=$(grep $1 $txt_file)
if [ $? -eq 0 ]; then
eval echo $2
fi
done
}
query='hoge'
#Fügen Sie die in der Funktion verwendeten Variablen in die Ausgabenachricht ein
message='Suchziel gefunden.Dateiname gefunden:$txt_file'
grep_text $query "${message}"
query='fuga'
message='Suchziel gefunden.Satz gefunden:$grep_result'
grep_text $query "${message}"
Ausführungsergebnis
$ ./success.sh
Suchziel gefunden.Dateiname gefunden:hoge.txt
Suchziel gefunden.Satz gefunden:fuga fuga
Wenn Sie eval nicht verwenden, werden die Variablen in der Zeichenfolge nicht ausgewertet, wie unten gezeigt.
failed.sh
#!/bin/bash
grep_text() {
for txt_file in $(ls . | grep ".txt$"); do
grep_result=$(grep $1 $txt_file)
if [ $? -eq 0 ]; then
#Wenn Sie eval nicht verwenden
echo $2
fi
done
}
query='hoge'
message='Suchziel gefunden.Dateiname gefunden:$txt_file'
grep_text $query "${message}"
query='fuga'
message='Suchziel gefunden.Satz gefunden:$grep_result'
grep_text $query "${message}"
Ausführungsergebnis
$ ./fail.sh
Suchziel gefunden.Dateiname gefunden:$txt_file
Suchziel gefunden.Satz gefunden:$grep_result
cmd.sh
#!/bin/bash
grep_text() {
for txt_file in $(ls | grep ".txt$"); do
#Führen Sie grep aus, das als Argument übergeben wurde
grep_result=$(eval $1)
#Wenn ein Suchmuster gefunden wird,Nachricht ausgeben
if [ -n "$grep_result" ]; then
echo "Suchziel gefunden.Satz gefunden:$grep_result"
fi
done
}
cmd='grep "hoge" $txt_file'
echo $cmd
grep_text "$cmd"
cmd='grep "fuga" $txt_file'
echo $cmd
grep_text "$cmd"
Ausführungsergebnis
$ ./cmd.sh
grep "hoge" $txt_file
Suchziel gefunden.Satz gefunden:hoge hoge
grep "fuga" $txt_file
Suchziel gefunden.Satz gefunden:fuga fuga
Recommended Posts