2017-09-12 4 views
0

Donc j'essaie de comprendre ce comportement bizarre.Exécuter des commandes Linux avec des guillemets

$ hello hello   
-ksh: hello: not found [No such file or directory] 
$ "hello hello" 
-ksh: hello hello: not found [No such file or directory] 
$ echo hello hello 
hello hello 
$ `echo hello hello` 
-ksh: hello: not found [No such file or directory] 
$ echo \"hello hello\" 
"hello hello" 
$ `echo \"hello hello\"` 
-ksh: "hello: not found [No such file or directory] 

Les 2ème et 6ème commandes sont les plus pertinentes pour ma question. Si je cours cette deuxième commande "hello hello", alors il évaluera cela comme un grand argument. Toutefois, si j'essaie d'exécuter cette dernière commande

`echo \"hello hello\"` 

alors il devrait avoir le même comportement? Mais il voit "hello comme son propre mot indépendant. Est-ce que certains peuvent expliquer cela et comment je peux obtenir que cette 6ème commande fonctionne comme la 2ème commande, de telle sorte qu'elle évalue "bonjour bonjour" comme une déclaration entière?

(Ceci a une application plus pratique, mais c'était le plus petit exemple que je pouvais produire).

Merci d'avance!

EDIT: Je vois que j'ai reçu un downvote, donc je serai plus concret sur le problème que je rencontre.

rcli4 6379 keys AAA* | sed -e "s/.*/'&'/" | while read line; do rcli4 6379 get $line; done 

Notez que rcli4 est juste un alias pour redis-cli -p. Je continue d'obtenir un

(error) ERR wrong number of arguments for 'get' command 

qui est due à l'analyse incorrecte des guillemets. J'ai essayé différentes combinaisons de choses comme l'ajout de citations, la suppression de l'instruction sed, etc. en vain, mais je pense qu'être capable de résoudre mon problème hello bonjour d'origine me donnera suffisamment d'informations sur la façon de résoudre mon problème spécifique.

+0

'ksh' n'est pas' bash', vous devrez peut-être corriger vos balises ou votre shell –

+1

A l'intérieur d'une chaîne entre guillemets, une citation est juste un autre caractère. Il n'a pas de pouvoir spécial. – John1024

+0

@EricRenouf Oups!Merci –

Répondre

1

A l'intérieur d'une chaîne entre guillemets, un guillemet est juste un autre caractère. Il n'a pas de pouvoir spécial.

Si je comprends bien le problème comme il est indiqué dans l'édition, la solution est de citer $lineà l'intérieur de la do-boucle, pas avant elle. Ainsi, essayez:

rcli4 6379 keys 'AAA*' | while read -r line; do rcli4 6379 get "$line"; done 

Sans les guillemets doubles autour $line, la coquille exécuterait mot fractionnement du développement des chemins et sur le contenu de line. Tu ne veux pas non plus. Les doubles guillemets suppriment les deux. En outre, nous avons ajouté l'option -r à read. Cela empêche read de faire le traitement antislash sur le contenu de line.

Enfin, nous mettons des guillemets simples autour de la clé de base de données glob AAA*. Sans guillemets, le shell interprétera AAA* comme un glob de fichier et effectuera extension de chemin d'accès dessus. S'il se trouve des fichiers dans le répertoire courant correspondant à ce glob, les résultats seront inattendus et non désirés. Si l'option bash nullglob est définie, le résultat ne sera pas ce que vous voulez, quels que soient les fichiers présents dans le répertoire en cours.