1 votes

Ecrire le résultat du pipe dans une variable

Je dois être capable d'écrire si le test pour un grep est soit VRAI o FAUX à une variable pour que je puisse l'utiliser plus tard

Pour l'exemple suivant, si j'exécute

defaults read com.apple.Finder | grep "AppleShowAllFiles"

sur mon système, il renvoie

AppleShowAllFiles = FALSE;

Cool. Maintenant, je veux diriger cette réponse vers une sorte de test. C'est là que je suis coincé.

Je pense que si je peux acheminer/assigner cette sortie à une variable spécifique, je pourrai effectuer un test sur celle-ci. Maintenant, disons que j'ai assigné la valeur de cette sortie à une variable, dans ce cas je vais utiliser $ASAF comme variable, je peux l'exécuter dans un test comme celui-ci

if [ $ASAF = "AppleShowAllFiles = TRUE ;" ] ; then
defaults write com.apple.Finder AppleShowAllFiles FALSE
killall Finder
sinon
defaults write com.apple.Finder AppleShowAllFiles True
killall Finder
fi

S'il existe une autre façon de procéder, je serais plus qu'ouvert aux options. Je n'ai pas eu à faire quelque chose de ce genre depuis un certain temps et je suis un peu désemparé. J'ai un peu cherché sur Google, mais il n'y avait que des réponses sans explications et l'utilisation de la valeur de retour de 0 o 1 . Je pense que la sortie retournée étant assignée à une variable serait plus appropriée, car alors je peux l'utiliser encore et encore dans le script selon les besoins.

2voto

rici Points 3733

Si vous voulez simplement enregistrer le code de retour (succès/échec) d'une commande, utilisez $? :

# grep -q to avoid sending output to `stdout` and to stop if it finds the target.
defaults read com.apple.Finder | grep -q "AppleShowAllFiles"
NOTFOUND=$?

# Note that we use an *arithmetic* test, not a string test, and that we have to
# invert the arithmetic value.

if ((!NOTFOUND)); then
  # not NOTFOUND is FOUND
  # ...
fi

Vous pouvez également enregistrer la sortie dans une variable, si, comme dans votre exemple, vous avez besoin de la chaîne de caractères réelle. Dans ce cas, votre solution est raisonnable, mais sachez que l'analyse syntaxique de la sortie de programmes comme defaults peuvent être assez fragiles, car des changements mineurs de format peuvent faire en sorte que les motifs ne correspondent plus. Essayez de rendre vos modèles aussi généraux que possible :

# Here we use the `-m1` flag to stop matching as soon as the first line matches
ASAF_STRING=$(defaults read com.apple.Finder | grep -m1 "AppleShowAllFiles")

# Try to parse true or false out of the string. We do this in a subshell to
# avoid changing the shell option in the main shell.
ASAF=$(
  shopt -s nocasematch
  case $ASAF_STRING in 
    *true*) echo TRUE;;
    *false*) echo FALSE;;
    *) echo Could not parse AppleShowAllFiles >> /dev/stderr;;
  esac
)

1voto

Eric Points 9

Je vois deux façons de procéder, selon que l'on a besoin de la variable plus d'une fois ou non.

Si vous n'avez besoin de la variable qu'une seule fois, vous pouvez simplement combiner le grep dans votre instruction if, c'est-à-dire

if defaults read com.apple.Finder | grep -q "AppleShowAllFiles" ; then ...

Ou, si vous avez besoin d'utiliser la variable plus d'une fois, vous pourriez faire quelque chose comme ceci

defaults read com.apple.Finder | grep -q "AppleShowAllFiles"

ASAF=$ ? ##$ ? est égal à la valeur de retour de la dernière commande

if [ "$ASAF" -eq "0"] ; then ...

1voto

Tech29 Points 11

Vous n'avez pas besoin d'utiliser grep du tout :

[[ $(defaults read com.apple.finder AppleShowAllFiles)  0 ]] && bool=true || bool=false
defaults write com.apple.finder AppleShowAllFiles -bool $bool
osascript -e 'quit app "Finder";

defaults read imprime les valeurs booléennes comme 1 o 0 .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X