[LINUX] Auswerten, Verketten und Ausführen von Zeichenfolgen in Variablen mithilfe von eval in bash

Zweck

Umgebung

eval Verwendungsbeispiel

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

Variablen in einer Zeichenfolge auswerten und mit Echo ausgeben

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

Befehle in Strings auswerten und ausführen

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

Auswerten, Verketten und Ausführen von Zeichenfolgen in Variablen mithilfe von eval in bash
Verwendung globaler Variablen in Python-Funktionen
Suche nach Zeichenketten in Dateien [Vergleich zwischen Bash und PowerShell]
Hinweise zur Verwendung von cChardet und python3-chardet in Python 3.3.1.
Beispiel für die Verwendung von Klassenvariablen und Klassenmethoden
Python-Variablen und Datentypen, die mit Chemoinfomatik gelernt wurden
Unterschied zwischen Variablen und Selbst. Variablen in der [Python] -Klasse
Überprüfen von Methoden und Variablen mithilfe der Bibliothek siehe
J / N-Verarbeitung mit Bash, Python und Go
Versuchen Sie, die ChatWork-API und die Qiita-API in Python zu verwenden