Évaluer, concaténer et exécuter des chaînes de caractères dans des variables en utilisant eval dans bash

Objectif

--Evaluer et exécuter une chaîne dans une variable en utilisant eval avec bash --Utilisez eval dans bash pour concaténer et exécuter des chaînes dans des variables

environnement

exemple d'utilisation eval

On suppose que les deux fichiers txt suivants sont stockés dans le même répertoire.

hoge.txt


hoge hoge

fuga.txt


fuga fuga

Utilisez eval pour évaluer et concaténer des chaînes au lieu de simples chaînes. Je vais omettre l'explication des fonctions de base de eval.

example.sh


#!/bin/bash

value='hoge'

#Stocker la commande sous forme de chaîne dans une variable
#Cas où les commandes sont données sous forme de chaînes aux fonctions dans bash,
#En supposant un cas où une commande est lue comme une chaîne de caractères à partir d'un fichier
cmd='grep $value hoge.txt'

echo $cmd
#production-> grep $value hoge.txt
#En cas d'écho, la commande n'est pas exécutée.Les variables ne sont pas développées et sont affichées sous forme de chaînes

eval $cmd
#production-> hoge hoge
#Dans le cas de eval, la variable est développée et la commande est exécutée.

Résultat d'exécution


$ ./example.sh
grep $value hoge.txt
hoge hoge

Évaluer les variables dans une chaîne et générer une sortie avec écho

success.sh


#!/bin/bash

#Exécutez grep sur le fichier txt dans le même répertoire,Si un modèle de recherche est trouvé,Fonction pour sortir un message.
#Motif de recherche comme premier argument,Passez le message à sortir au deuxième 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'
#Inclure les variables utilisées dans la fonction dans le message de sortie
message='Cible de recherche trouvée.Nom de fichier trouvé:$txt_file'
grep_text $query "${message}"

query='fuga'
message='Cible de recherche trouvée.Phrase trouvée:$grep_result'
grep_text $query "${message}"

Résultat d'exécution


$ ./success.sh
Cible de recherche trouvée.Nom de fichier trouvé:hoge.txt
Cible de recherche trouvée.Phrase trouvée:fuga fuga

Si vous n'utilisez pas eval, les variables de la chaîne ne seront pas évaluées, comme indiqué ci-dessous.

failed.sh


#!/bin/bash

grep_text() {
	for txt_file in $(ls . | grep ".txt$"); do
		grep_result=$(grep $1 $txt_file)
		if [ $? -eq 0 ]; then
			#Lorsque vous n'utilisez pas eval
			echo $2
		fi
	done
}

query='hoge'
message='Cible de recherche trouvée.Nom de fichier trouvé:$txt_file'
grep_text $query "${message}"

query='fuga'
message='Cible de recherche trouvée.Phrase trouvée:$grep_result'
grep_text $query "${message}"

Résultat d'exécution


$ ./fail.sh
Cible de recherche trouvée.Nom de fichier trouvé:$txt_file
Cible de recherche trouvée.Phrase trouvée:$grep_result

Évaluer et exécuter des commandes dans des chaînes

cmd.sh


#!/bin/bash

grep_text() {
	for txt_file in $(ls | grep ".txt$"); do
		#Exécuter grep passé en argument
		grep_result=$(eval $1)
		#Si un modèle de recherche est trouvé,Message de sortie
		if [ -n "$grep_result" ]; then
			echo "Cible de recherche trouvée.Phrase trouvée:$grep_result"
		fi
	done
}

cmd='grep "hoge" $txt_file'
echo $cmd
grep_text "$cmd"

cmd='grep "fuga" $txt_file'
echo $cmd
grep_text "$cmd"

Résultat d'exécution


$ ./cmd.sh
grep "hoge" $txt_file
Cible de recherche trouvée.Phrase trouvée:hoge hoge
grep "fuga" $txt_file
Cible de recherche trouvée.Phrase trouvée:fuga fuga

Recommended Posts

Évaluer, concaténer et exécuter des chaînes de caractères dans des variables en utilisant eval dans bash
Utilisation de variables globales dans les fonctions python
Rechercher des chaînes de caractères dans les fichiers [Comparaison entre Bash et PowerShell]
Notes utilisant cChardet et python3-chardet dans Python 3.3.1.
Exemple d'utilisation de variables de classe et de méthodes de classe
Variables Python et types de données appris avec la chimio-automatique
[python] Différence entre variable et self. Variable dans la classe
Vérification des méthodes et des variables à l'aide de la bibliothèque voir
Traitement Y / n avec bash, Python et Go
Essayez d'utiliser l'API ChatWork et l'API Qiita en Python