--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
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
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
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