Affectation / utilisation de la variable ZSH / Shell

J’utilise ZSH pour mon terminal de terminal et, bien que j’aie écrit plusieurs fonctions pour automatiser des tâches spécifiques, je n’ai jamais vraiment tenté quoi que ce soit qui nécessite les fonctionnalités dont je dispose pour le moment.

J’ai récemment réécrit un blog en utilisant Jekyll et je veux automatiser la production des articles de blog et enfin le téléchargement des fichiers nouvellement produits sur mon serveur en utilisant quelque chose comme scp.

Je suis un peu confus au sujet des liaisons variables / utilisation dans ZSH; par exemple:

DATE= date +'20%y-%m-%d' echo $DATE 

produit correctement le 2011-08-23 comme je l’espérais.

Mais quand j’essaye:

 DATE= date +'20%y-%m-%d' FILE= "~/path/to/_posts/$DATE-$1.markdown" echo $FILE 

Il produit:

 2011-08-23 blog.sh: line 4: ~/path/to/_posts/-.markdown: No such file or directory 

Et lorsqu’il est exécuté avec ce que je voudrais que le titre du blog soit (en ignorant le fait que la chaîne doit être manipulée pour la rendre plus conviviale et que le chemin d’access / to n’existe pas)

c’est-à-dire blog “titre du blog”, sorties:

 2011-08-23 blog.sh: line 4: ~/path/to/_posts/-blog title.markdown: No such file or directory 

Pourquoi $ DATE imprime-t-il au-dessus de l’appel pour imprimer $ FILE plutôt que la chaîne incluse dans $ FILE?

Deux choses se passent mal ici.

Premièrement, votre premier extrait ne fait pas ce que je pense que vous pensez. Essayez de supprimer la deuxième ligne, l’ echo . Il imprime toujours la date, non? Car ce:

 DATE= date +'20%y-%m-%d' 

N’est pas une affectation de variable – c’est une invocation de date avec une variable d’environnement auxiliaire (la syntaxe générale est VAR_NAME=VAR_VALUE COMMAND ). Tu veux dire ça:

 DATE=$(date +'20%y-%m-%d') 

Votre deuxième extrait échouera toujours, mais différemment. Encore une fois, vous utilisez la syntaxe invoke-with-environment au lieu de l’affectation. Vous voulez dire:

 # note the lack of a space after the equals sign FILE="~/path/to/_posts/$DATE-$1.markdown" 

Je pense que ça devrait faire l’affaire.

Disclaimer: bien que je sache très bien, j’ai seulement commencé à utiliser zsh récemment; il y a peut-être des zshisms au travail ici que je ne connais pas.

En savoir plus sur ce qu’un shell appelle «l’expansion». Il existe plusieurs types, exécutés dans un ordre particulier:

L’ordre d’expansion des mots est le suivant:

  1. expansion de tilde
  2. extension des parameters
  3. substitution de commande
  4. expansion arithmétique
  5. extension de chemin d’access , sauf si set -f est en vigueur
  6. suppression de devis , toujours effectuée en dernier

Notez que l’extension tilde n’est effectuée que lorsque le tilde n’est pas cité. à savoir:

 $ FILE="~/.zshrc" $ echo $FILE ~/.zshrc $ FILE=~./zshrc $ echo $FILE /home/user42/.zshrc 

Et il ne doit y avoir aucun espace autour des affectations de variables = .

Comme vous avez demandé dans un commentaire où apprendre la programmation shell, il y a plusieurs options:

  • Lire la page de manuel du shell man zsh
  • Lisez la spécification du shell POSIX, http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html , surtout si vous souhaitez exécuter vos scripts sur différents systèmes d’exploitation (et vous vous retrouverez dans cette situation belle journée!)
  • Lire des livres sur la programmation shell.
  • Reste dans le groupe de discussion usenet comp.unix.shell où beaucoup d’assistants de shell répondent aux questions