30 ottobre, 2019

Bash scripts - cose che devo ricordarmi - 1


Capita ogni tanto che scopro (o riscopro) cose che poi dimentico. Adesso le scrivo per ricordarmele, forse.

Recentemente visto che continuavo a riscrivere lo stesso comando non proprio corto (diciamo più di una ventina di caratteri) mi sono convinto che era da scriptare. Con una sorpresa per me che dimentico come si fa; o forse è nuova, diciamo dopo il '90; anche perché allora niente Bash.

Non racconto per davvero lo script per ragioni di riservatezza (no, dai LOL!) faccio qualcosa di più semplice. Il problema è prendere nota della pensata momentanea prima di dimenticarla: appena viene la memorizzo con data e ora in un file (di testo, l'unico tipo sensato). La prima versione:

#!/bin/bash

if [ -z $1 ]; then
    echo 'ARRGGGHHHH!!!!!'
    exit 2
fi

nomefile=$1
shift
ora=$(date "+%e %b %Y - %H:%M")

echo "$ora -> $*" > $nomefile


lo rendo eseguibile e provo:

$ chmod +x nota-0
$ ./nota-0 memo prova di nota in locale
$ cat memo
29 ott 2019 - 14:00 -> prova di nota in locale
$


OK, funziona. Il problema è che le note vengono sparse per tutto il disco (e non solo) e poi devo andarle a cercare. Ah! inoltre se ripeto un nome la vecchia nota viene eliminata: l'idea è di mettere la data nel nome del file (io sono della vecchia scuola niente spazi nei nomi dei flies). Aggiorno lo script, tutte le note saranno memorizzate in una directory, per me ~/lab/note:

#!/bin/bash

if [ -z $1 ]; then
    echo 'ARRGGGHHHH!!!!!'
    exit 2
fi

dirnote=$HOME"/lab/note/"
nomefile=$1
shift
ora=$(date "+%e_%b_%Y-%H.%M")

echo "$ora -> $*" > $dirnote$ora-$nomefile


la provo ed ecco:

$ ./nota-1 test prova di nota nella dir delle note$ ls -l ~/lab/note
totale 4
-rw-r--r-- 1 juhan juhan 56 ott 29 14:10 29_ott_2019-14.10-test
$ cat ~/lab/note/29_ott_2019-14.10-test
29_ott_2019-14.10 -> prova di nota nella dir delle note

$
 
Funziona. Ma la riga

    echo "$ora -> $*" > $dirnote$ora-$nomefile

è stata giudicata poco chiara ("brutta" ha detto) da un mio valente collaboratore. Ha ragione, mi ha aperto Stack Overflow e ha cercato per "bash script braces" (o qualcosa di simile) e sì, la versione definitiva dello script:

#!/bin/bash

if [ -z $1 ]; then
    echo 'ARRGGGHHHH!!!!!'
    exit 2
fi

dirnote=$HOME"/lab/note/"
nomefile=$1
shift
ora=$(date "+%e_%b_%Y-%H.%M")

echo "$ora -> $*" > "${dirnote}${ora}-${nomefile}"


$ chmod +x nota$ ./nota ultimo-memo prova definitiva con lo script più bello$ ls -l ~/lab/note
totale 8
-rw-r--r-- 1 juhan juhan 56 ott 29 14:10 29_ott_2019-14.10-test
-rw-r--r-- 1 juhan juhan 63 ott 29 14:21 29_ott_2019-14.21-ultimo-memo
$ cat ~/lab/note/29_ott_2019-14.21-ultimo-memo
29_ott_2019-14.21 -> prova definitiva con lo script più bello

$
 
OK. Ma ancora una cosa, vecchia ma sempre attuale: RTFM (dovevo anzi pensarci prima). Il manuale è qui. Ci sono altre cose, per altri post.

In alternativa a Bash, specie se lo script diventa lungo o complesso, è possibile ricorrere a un linguaggio di scripting con il vantaggio che con qualche minima modifica funzionerebbe anche sotto Windows. Io propongo Python, JavaScript mi dice l'über-nerd del mio collaboratore. Opinioni contrastanti, da discuterne.

🔴

Nessun commento:

Posta un commento