web-dev-qa-db-fra.com

Affectation du résultat d'une commande à une variable

Je suis nouveau avec Unix et j'écris un script Shell.

Lorsque je lance cette ligne sur la commande Invite, elle affiche le nombre total de processus correspondant à:

ps -ef | awk '/siebsvc –s siebsrvr/ && !/awk/ { a++ } END { print a }'

par exemple, la sortie de la ligne ci-dessus est 2 dans l'invite de commande.

Je veux écrire un script Shell dans lequel la sortie de la ligne ci-dessus (2) est affectée à une variable, qui sera utilisée ultérieurement pour la comparaison dans une instruction if.

Je cherche quelque chose comme

output= `ps -ef | awk '/siebsvc –s siebsrvr/ && !/awk/ { a++ } END { print a }'`
echo $output

Mais quand je le lance, il dit que la sortie n'a pas pu être trouvée alors que j'en attendais 2. Aidez-moi.

55
user3114665

Vous pouvez utiliser un $ signe comme:

OUTPUT=$(expression)
99
Marutha

Essayer:

output=$(ps -ef | awk '/siebsvc –s siebsrvr/ && !/awk/ { a++ } END { print a }'); echo $output

Envelopper votre commande dans $( ) demande au shell d’exécuter cette commande, au lieu de tenter de définir la commande elle-même sur la variable nommée "sortie". (Notez que vous pouvez également utiliser les backticks `command`.)

Je peux fortement recommander http://tldp.org/LDP/abs/html/commandsub.html pour en savoir plus sur le remplacement de commande.

De plus, comme le souligne correctement 1_CR dans un commentaire, l'espace supplémentaire entre le signe égal et l'affectation entraîne son échec. Voici un exemple simple sur ma machine du comportement que vous rencontrez:

jed@MBP:~$ foo=$(ps -ef |head -1);echo $foo
UID PID PPID C STIME TTY TIME CMD

jed@MBP:~$ foo= $(ps -ef |head -1);echo $foo
-bash: UID: command not found
UID PID PPID C STIME TTY TIME CMD
14
Jed Daniels

Si vous voulez le faire avec multiline/multiple command/s, vous pouvez le faire:

output=$( bash <<EOF
#multiline/multiple command/s
EOF
)

Ou:

output=$(
#multiline/multiple command/s
)

Exemple:

#!/bin/bash
output="$( bash <<EOF
echo first
echo second
echo third
EOF
)"
echo "$output"

Sortie:

first
second
third
8
Jahid