2011-08-23 12 views
6

Uso ZSH per la mia shell di terminale e mentre ho scritto diverse funzioni per automatizzare attività specifiche, non ho mai provato veramente qualcosa che richieda la funzionalità che sto cercando al momento.Assegnazione/utilizzo variabile ZSH/Shell

Ho recentemente riscritto un blog utilizzando Jekyll e voglio automatizzare la produzione di post del blog e infine il caricamento dei file appena prodotti sul mio server usando qualcosa come scp.

Sono leggermente confuso circa le associazioni di variabili/utilizzo in ZSH; ad esempio:

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

correttamente uscite 2011-08-23 come mi aspetto.

Ma quando provo:

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

Produce:

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

E quando correre con quello che avrei voglia il titolo del blog per essere (ignorando il fatto che la stringa deve essere manipolato per renderlo più url friendly e che il percorso percorso/a non esiste)

ie blog "titolo blog", uscite:

Perché stampa $ DATE sopra la chiamata per stampare $ FILE anziché la stringa inclusa in $ FILE?

+0

'date +% Y-% m-% d' è più pulita di' date + 20% Y-% m-% d'. 'date +% F' è ancora più pulito. (Questo presuppone che il comando 'date' supporti questi formati, la data di GNU lo fa, ma altri no.) –

risposta

16

Qui due cose vanno male.

In primo luogo, il tuo primo frammento non sta facendo quello che penso tu pensi che sia. Prova a rimuovere la seconda riga, lo echo. Stampa ancora la data, giusto? Perché questo:

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

non è un assegnamento di variabile - è un'invocazione di date con una variabile d'ambiente ausiliaria (la sintassi generale è VAR_NAME=VAR_VALUE COMMAND). Intendi questo:

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

Il tuo secondo snippet continuerà a fallire, ma in modo diverso. Di nuovo, si sta utilizzando la sintassi invoke-with-environment anziché l'assegnazione. Intendi:

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

Penso che dovrebbe fare il trucco.

Disclaimer: mentre conosco molto bene bash, ho iniziato a utilizzare zsh solo di recente; ci possono essere zshismi al lavoro qui di cui non sono a conoscenza.

+0

Molto apprezzato, funziona esattamente come volevo. In che punto hai saputo di bash, in particolare cose come invocare-con-ambiente e simili? Probabilmente mi imbatterò in ulteriori problemi e avere un posto dove fare riferimento sarebbe di grande aiuto. – HaaR

+0

Kid, ho imparato a scrivere la mia shell sulla strada. Sul serio. Metaforicamente, ma sul serio. Uso una linea di comando unix su base giornaliera dal 1998, con un po 'di script occasionali, e ho fatto degli scripting seria come parte del mio lavoro per alcuni anni. Lavoro con altre persone che conoscono bene lo script e imparano da loro. Faccio domande sui newsgroup. Leggo gli script nei pacchetti che uso. Leggo una buona documentazione quando la trovo - che per script di shell, purtroppo non è frequente. –

+3

I tre documenti che vale davvero la pena di leggere sono la patchy ma indispensabile [Advanced Bash-Scripting Guide] (http://tldp.org/LDP/abs/html/), il piacevolmente buono ma piuttosto scoraggiante [Bash Reference Manual] (http: //www.gnu.org/software/bash/manual/bashref.html), e, naturalmente, 'man bash'. Dovresti anche leggere l'eccellente consiglio di [Richard Kettlewell] (http://www.greenend.org.uk/rjk/2001/04/shell.html) e [David Pashley] (http://www.davidpashley.com) /articles/writing-robust-shell-scripts.html). –

7

Ulteriori informazioni su ciò che una shell chiama "espansione".Ci sono diversi tipi, eseguite in un ordine particolare:

L'ordine di espansione parola è la seguente:

  1. espansione tilde
  2. espansione di parametro
  3. sostituzione di comando
  4. espansione aritmetica
  5. espansione di percorso, a meno che non set -f è in effetti
  6. rimozione citazione, sempre eseguita lo scorso

Si noti che l'espansione della tilde viene eseguita solo quando la tilde, non è citato; vale a dire .:

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

E non ci devono essere spazi in tutto il = in assegnazioni di variabili.

Dal momento che lei ha chiesto in un commento dove imparare programmazione della shell, ci sono diverse opzioni:

  • leggere pagina di manuale della shell man zsh
  • leggere la specifica della shell POSIX, http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html, soprattutto se si vuole per eseguire i tuoi script su diversi sistemi operativi (e tu ti troverai in quella situazione un bel giorno!)
  • Leggi i libri sulla programmazione della shell.
  • Andare a trovare nel comp.unix.shell usenet newsgroup dove un sacco di maghi shell rispondere alle domande
Problemi correlati