2012-10-11 12 views
7

Sto provando a scrivere uno script che prende il nome di base di un argomento, quindi controlla se c'è un'estensione in tale argomento. Se c'è, stampa l'estensione.Bash basename sintassi

Ecco il mio codice:

file=basename $1 
ext=${file%*} 
echo ${file#"$stub"} 
echo $basename $1 

sto facendo eco al $ basename finale $ 1 a controllare che l'output di basename è.

Alcuni test rivelano:

testfile.sh one.two 
./testfile: line 2: one.two: command not found 
one.two 

testfile.sh ../tester 
./testfile: line 2: ../tester: No such file or directory 
../tester 

Quindi né $ basename $ 1 sono lavorando. So che si tratta di un errore di sintassi, quindi qualcuno potrebbe spiegare cosa sto facendo male?

EDIT:

Ho risolto il mio problema ora con:

file=$(basename "$1") 
stub=${file%.*} 
echo ${file#"$stub"} 

che riduce la mia tesi a un nome base, grazie a tutti voi.

+0

La sintassi corretta è file = $ (basename $ 1). Ti consiglierei di usare file = $ {1 ## * /}, che rimuoverà ogni sequenza '* /'. In realtà è molto più veloce del comando basename, specialmente quando si elaborano file in un loop. –

risposta

12

In primo luogo, la sintassi è sbagliata:

file=$(basename "$1") 

In secondo luogo, questa è la corretta espressione per ottenere il nome del file (ultimo) di estensione:

ext=${file##*.} 
+0

Grazie per la prima parte, mi rendo conto che ora il file è uguale all'output di basename, quindi questo aiuta.Ora il mio programma non funziona come previsto, il che significa che sta provando tester.two invece di. Due se il mio argomento iniziale è tester.two. Prima ho aggiunto basename, il mio script è stato ouputo come previsto a parte quando ho provato ../tester, che non dovrebbe produrre nulla. – Unknown

8

Se si desidera assegnare a una variabile l'output di un comando, è necessario eseguirlo, con virgolette posteriori o utilizzando una parentesi speciale che cita:

file=`basename "$1"` 
file=$(basename "$1") 

Per rimuovere l'estensione di un nome di file che si dovrebbe fare

ext=${file#*.} 

questo otterrà il valore di $file, poi rimuovere tutto ciò fino al periodo (è per questo che è necessario). Se il tuo nome del file contiene periodi, dovresti usare ext=${file##*.}, dove lo ## dice a bash di eliminare la stringa più lunga che corrisponde al posto del più breve, quindi eliminerà fino all'ultimo periodo, invece del primo.

Il tuo echo $basename $1 è strano. Sta dicendo a bash di stampare il valore di una variabile chiamata $basename e il valore della variabile $1, che è il primo argomento dello script (o funzione).

Se si desidera stampare il comando si sta cercando di eseguire, fare questo:

echo basename $1 

Se stai cercando di stampare l'output del comando, si può fare uno di:

echo $(basename "$1") 
echo "$file" 
basename "$1" 

Spero che questo aiuti =)

Problemi correlati