2012-04-18 12 views
51

Ho un variabile Bash, $word, che a volte è una parola o una frase, ad esempio:Come ottenere la prima lettera in una variabile Bash?

word="tiger" 

Oppure:

word="This is a sentence." 

Come posso fare una nuova variabile Bash, che è pari a solo il prima lettera trovata nella variabile? Per esempio, quanto sopra sarebbe:

echo $firstletter 
t 

Oppure:

echo $firstletter 
T 

risposta

22
initial="$(echo $word | head -c 1)" 

Ogni volta che si dice "prima" nella descrizione del problema, head è una soluzione probabile.

+6

Si noti che non è presente l'opzione '-c' in POSIX head: . – gioele

+3

Ciò restituisce la prima lettera, ma è un eccesso e la soluzione dipende da utilità esterne (testa). Questo può essere fatto in puro guscio, che è più pulito. – automatthias

+10

Questa non dovrebbe essere la risposta accettata, per i motivi indicati nei commenti sopra. Le risposte reali sono sotto - '$ {parola: 0: 1}' o '$ {parola :: 1}'. – noamtm

170
word="tiger" 
firstletter=${word:0:1} 
+3

Esattamente quello che stavo cercando. One-liner, senza subshell di generazione. Prendi il mio voto! –

58
word=something 
first=${word::1} 
+1

Questo sarebbe meraviglioso, ma non funziona per me, né in bash 4.3.11 né in zsh 5.0.5 – yoniLavi

+1

Con GNU bash v4.3.11, 'first' è impostato sulla lettera' s'. Puoi vederlo con 'echo $ s'. Se questo non funziona per te, e ti piacerebbe aiutare il debugging, ti preghiamo di copiare e incollare i comandi che hai digitato e il loro output. –

+1

Grazie Adam, il mio male, non riesco a capire perché non ha funzionato per me prima, ma funziona perfettamente bene ora su diverse versioni di bash che ho provato, tornando a GNU bash, v3.1.0. Ancora non funziona in zsh, ma la domanda è taggata "bash", quindi è irrilevante. – yoniLavi

1

Dal momento che si dispone di un tag sed qui è una risposta sed:

echo "$word" | sed -e "{ s/^\(.\).*/\1/ ; q }" 

Commento Live per chi ama coloro (I do!):

{

  • s: avviare una sostituzione di routine
    • /: Avviare specificare che cosa deve essere sostituito
    • ^\(.\): catturare il primo carattere nel Gruppo 1
    • .*:, assicurarsi che il resto della linea sarà nella sostituzione
    • /: iniziare specificando la sostituzione
    • \1: inserire Gruppo 1
    • /: Il resto viene scartato ;
  • q: Chiudere sed modo da non ripetere questo blocco per altre linee se ci sono.

}

Bene che è stato divertente! :) È anche possibile utilizzare grep e così via, ma se si è in bash la magia ${x:0:1} è ancora la soluzione migliore.(Ho passato come un'ora cercando di utilizzare POSIX espansione variabile per farlo, ma non poteva :()

+0

Ho pubblicato una soluzione POSIX qui: https://stackoverflow.com/a/44988512/4694621 –

0

Utilizzando bash 4:

x="test" 
read -N 1 var <<< "${x}" 
echo "${var}" 
Problemi correlati