Question

J'ai essayé d'innombrables façons d'obtenir ce que je veux, mais rien ne semble fonctionner. Je finis toujours avec quelque chose comme 2:not found.

Je veux capturer la sortie d'une commande, puis testez si elle est égale, comme si « ! »:

function test() {
  local testv=$(command) 2>/dev/null
  if [ $(#testv) == "!" ]; then
    echo "Exclamation mark!"
  else
    echo "No exclamation mark."
  fi
}

Comment dois-je réécrire le code ci-dessus pour éviter le test:2: = not found d'erreur?

Était-ce utile?

La solution

Cela devrait fonctionner:

if [ $testv = '!' ]; then

Il y avait plusieurs problèmes ici:

  • $(...) exécute une commande et substitue sa sortie; vous voulez substituer une valeur variable, donc l'utilisation $var ou ${var}.
  • Je ne sais pas ce que le # faisait là. ${#var} aura la durée de $ var, mais ce n'est pas ce que vous voulez ici.
  • La commande test (qui [ est synonyme de) ne comprend pas ==, donc utilisez = (si vous êtes un programmeur C qui va chercher mauvais , mais ce n'est pas shell C ).
  • Je ne pense pas que ce soit un problème dans un script, mais pour "!" d'entrée interactive ne fait pas ce que vous attendez. Je '!' pour vous assurer que le point d'exclamation ne pouvait être interprété comme une option historique.

Alternativement, vous pouvez utiliser [[ ]] au lieu de [ ], car il comprend == (et a un peu plus propre syntaxe en général):

if [[ $testv == '!' ]]; then

BTW, je suis confiant de l'étiquette que ce script est en cours d'exécution dans zsh; sinon, la syntaxe sera différente de bits (coquilles de base ne sont pas [[ ]], et tout autre que zsh feront l'analyse syntaxique indésirable sur la valeur de $ testv à moins que ce soit dans des guillemets doubles). Si vous n'êtes pas sûr (ou si vous voulez qu'il soit portable), voici une version qui devrait fonctionner dans une coquille conforme aux spécifications POSIX:

if [ "$testv" = '!' ]; then

Autres conseils

Essayez avec ceci:

local testv=$(command 2>/dev/null)

car il est la sortie de la commande que vous souhaitez rediriger.

(Je ne sais pas ce que vous entendez par $(#testv) bien.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top