Je veux affecter le résultat d'une expression à une variable et la concaténer avec une chaîne, puis l'exécuter en écho. Voici ce que j'ai
#!/bin/bash
cd ~/Desktop;
thefile= ls -t -U | grep -m 1 "Screen Shot";
echo "Most recent screenshot is: "$thefile;
Mais cela produit:
Screen Shot 2011-07-03 at 1.55.43 PM.png
Most recent screenshot is:
Donc, il semble que cela ne soit pas assigné à $thefile
, et soit imprimé comme il est exécuté.
Réponses:
Une assignation de shell est un mot unique, sans espace après le signe égal. Donc, ce que vous avez écrit attribue une valeur vide à
thefile
; de plus, l'assignation étant groupée avec une commande, elle créethefile
une variable d'environnement et l'affectation est locale pour cette commande particulière, c'est-à-dire que seul l'appel àls
voir la valeur assignée est vu .Vous voulez capturer le résultat d'une commande, vous devez donc utiliser la substitution de commande :
(Certains ouvrages proposent une syntaxe alternative
thefile=`ls …`
; la syntaxe backquote équivaut à la syntaxe dollar-parentheses, sauf que citer entre backquotes est parfois bizarre, utilisez-le$(…)
.)Autres remarques sur votre script:
-t
(trier par heure) avec-U
(ne pas trier) n'a pas de sens; juste utiliser-t
.Plutôt que d'utiliser
grep
pour faire correspondre les captures d'écran, il est plus clair de passer un caractère générique àls
ethead
de capturer le premier fichier:C'est généralement une mauvaise idée d'analyser la sortie de
ls
. Cela pourrait échouer assez mal si vous avez des noms de fichiers avec des caractères non imprimables. Cependant, il est difficile de trier les fichiers par datels
, c'est donc une solution acceptable si vous savez que les noms de fichier ne contiennent pas de caractères non imprimables ni de barres obliques inverses.Toujours utiliser des guillemets autour des substitutions de variables , c’est-à-dire ici écrire
Sans les guillemets doubles, la valeur de la variable est réexaminée, ce qui causera des problèmes si elle contient des espaces ou d'autres caractères spéciaux.
set -e
. Cela indique au shell de quitter si une commande échoue (en renvoyant un statut différent de zéro).Si vous avez GNU find (en particulier si vous utilisez Linux ou Cygwin non incorporé), il existe une autre approche pour rechercher le fichier le plus récent:
find
répertorier les fichiers et leurs dates, puis utilisersort
ettail
extraire le fichier le plus récent .Si vous êtes prêt à écrire ce script dans zsh au lieu de bash, il existe un moyen beaucoup plus facile d'attraper le fichier le plus récent, car zsh dispose de qualificatifs glob qui autorisent les correspondances génériques non seulement sur les noms, mais également sur les métadonnées du fichier. La
(om[1])
partie après le motif correspond aux qualificatifs glob;om
trie les correspondances en fonction de l'âge (c'est-à-dire l'heure de la modification, la plus récente en premier) et[1]
extrait la première correspondance uniquement. Toute la correspondance doit être entre parenthèses car c'est techniquement un tableau, car globbing renvoie une liste de fichiers, même si[1]
cela signifie que dans ce cas particulier, la liste contient (au plus) un fichier.la source
Si vous voulez le faire avec multiline / multiple command / s, vous pouvez le faire:
Ou:
Exemple:
Sortie:
la source
output=$(echo $someVariable)