Semplice script: non va...

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
utente2014

Semplice script: non va...

Messaggio da utente2014 »

Ho fatto una prova per iniziare ad imparare lo scipt bash ma mi ritrovo un'ambiente piu' ostico del previsto.
Ecco lo script che non funziona:

Codice: Seleziona tutto

#!/bin/sh

## stringhe valide
dato1="hello world"
dato2="prova bissseeessima"

##Prelevo dal file il dato
RISPOSTA=`grep "hello world" /tmp/tmp1.txt`
echo $RISPOSTA
if [ $RISPOSTA = $dato1 ]; then
	echo "OK! 1"
else
	echo "Pippo e pluto sono amici"
fi
RISPOSTA=`grep "prova bissseeessima" /tmp/tmp1.txt`
if [ $RISPOSTA = $dato2 ]; then
	echo "OK! 2"
else 
	echo "Pippo e pluto non sono amici"
fi
e il contenuto di tmp1.txt

Codice: Seleziona tutto

hello world
prova bissseeessima
Output ed Errori:

Codice: Seleziona tutto

sudo sh ./tsc.sh
hello world
./tsc.sh: 10: [: hello: unexpected operator
Pippo e pluto sono amici
./tsc.sh: 16: [: prova: unexpected operator
Pippo e pluto non sono amici
Grazie anticipatamente. :ciao:

P.S: per chiudere uno script bash non c'e' bisogno di nulla o c'e' qualche istruzione speciale da inserire?
Avatar utente
rpadovani
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3434
Iscrizione: lunedì 8 dicembre 2008, 19:49
Desktop: GNOME Shell
Distribuzione: Ubuntu 18.04 x86_64
Sesso: Maschile
Località: Munich, Germany
Contatti:

Re: Semplice script: non va...

Messaggio da rpadovani »

All'interno della condizione dell'if anche le variabili vanno tra doppi apici
Solutions Architect at nextbit | About me
Changing the world bit by bit
Avatar utente
vaillant
Rampante Reduce
Rampante Reduce
Messaggi: 8319
Iscrizione: domenica 15 marzo 2009, 9:54
Distribuzione: Ubuntu Server 20.04 LTS
Sesso: Maschile
Località: Modica

Re: Semplice script: non va...

Messaggio da vaillant »

Intanto non c'è bisogno di dare

Codice: Seleziona tutto

sudo sh ./tsc.sh
o fai

Codice: Seleziona tutto

sh tsc.sh
oppure, se eseguibile

Codice: Seleziona tutto

./tsc.sh
prova a mettere i doppi apici alle variabili

Codice: Seleziona tutto

#!/bin/sh

## stringhe valide
dato1="hello world"
dato2="prova bissseeessima"

##Prelevo dal file il dato
RISPOSTA=`grep "hello world" /tmp/tmp1.txt`
echo $RISPOSTA
if [ "$RISPOSTA" = "$dato1" ]; then
   echo "OK! 1"
else
   echo "Pippo e pluto sono amici"
fi
RISPOSTA=`grep "prova bissseeessima" /tmp/tmp1.txt`
if [ "$RISPOSTA" = "$dato2" ]; then
   echo "OK! 2"
else 
   echo "Pippo e pluto non sono amici"
fi
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Semplice script: non va...

Messaggio da vaeVictis »

Un paio di osservazioni:

1) /bin/sh su Ubuntu prevede l'esecuzione dello script tramite shell dash e non bash
Puoi leggere alcune indicazioni in questa discussione (in inglese, ma abbastanza comprensibile)
http://askubuntu.com/questions/141928/w ... d-bin-bash

Da terminale:

Codice: Seleziona tutto

vaevictis@vaevictis-HAL:~/Scrivania$ file /bin/sh
/bin/sh: symbolic link to `dash' 
vaevictis@vaevictis-HAL:~/Scrivania$ which dash
/bin/dash
vaevictis@vaevictis-HAL:~/Scrivania$ file /bin/dash
/bin/dash: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0f7ff287cf26eba9a6643b1226089eea57cb7e44, stripped
mentre

Codice: Seleziona tutto

vaevictis@vaevictis-HAL:~/Scrivania$ file /bin/bash
/bin/bash: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=796da7aa73903b1e5608a8ff8433669b7e00e980, stripped

Invece, il motivo per cui ti dà errore è che mancano le virgolette intorno alle variabili in test, come ti hanno già fatto notare.

2) l'istruzione grep che usi ti preleva tutta la stringa, che a priori (credo) non è quello che vuoi fare.
Ti conviene usare l'opzione -o del comando grep, per selezionare solo la parte che matcha.
Il contenuto del file

Codice: Seleziona tutto

vaevictis@vaevictis-HAL:~/Scrivania$ cat foo.txt 
hello world
prova bissseeessima
Come fai tu

Codice: Seleziona tutto

vaevictis@vaevictis-HAL:~/Scrivania$ grep hello foo.txt 
hello world
vaevictis@vaevictis-HAL:~/Scrivania$ bar=`grep hello foo.txt`
vaevictis@vaevictis-HAL:~/Scrivania$ echo $bar
hello world
Come ti consiglio di fare

Codice: Seleziona tutto

vaevictis@vaevictis-HAL:~/Scrivania$ bar=`grep -o "hello" foo.txt`
vaevictis@vaevictis-HAL:~/Scrivania$ echo $bar
hello
(L'ho fatto matchando solo hello per farti vedere che prende solo la parola interessata.
Ovviamente nel tuo esempio, dovresti essere nel caso non banale in cui altre cose nella stringa, oltre quello che vuoi matchare.)

edit:
ho editato il messaggio, perché conteneva alcuni errori (in particolare, avevo pensato che l'errore fosse dovuto al fatto che dash non ha il comando [ ma non è così :) )
questo non dovrebbe contenerne :)
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti