2013-07-23 11 views

risposta

5

È possibile utilizzare printf.

% printf 'str1%s\t' 'str2' 'str3' 'str4' 
str1str2 str1str3 str1str4 
3

Non sembra esserci un modo. Dovrai usare i loop per generare questi nomi, magari in una funzione. Oppure usa le variabili per sostituire le parti comuni, magari con "set -u" per evitare errori di battitura.

Vedo che si preferisce trattino per motivi di prestazioni, tuttavia non sembra che fornisca alcun numero a sostegno della propria decisione. Ti suggerirei di misurare la differenza di prestazioni effettiva e rivalutare. Potresti anche cadere nell'ottimizzazione prematura. Considera quanto tempo di implementazione e di debug salverà utilizzando Bash rispetto al possibile calo delle prestazioni.

+0

Penso che sia davvero l'ottimizzazione prematura, non ero sicuro perché non scrivo molti script di shell. Mi rendo conto che non fanno nulla di complicato quindi la differenza basterà solo il tempo di avvio ... – greg0ire

+0

@ greg0ire, sì, principalmente il tempo di avvio, ma può comunque essere importante per il tuo caso se hai bisogno di molte invocazioni di script, o usi molti sotto-shell nel tuo codice. Se la prestazione è importante per te, misurala per uno scenario tipico. Il tempo di – spbnick

+0

mi dà un calo di differenza: bash = 5ms, sh = 3ms. Penso che sia accettabile comunque. – greg0ire

0

Mi piace molto la soluzione fornita da printf @mikeserv, ma ho pensato di fornire un esempio utilizzando un ciclo.

Il seguente potrebbe essere molto utile se si desidera eseguire un comando per ogni stringa espansa, anziché fornire entrambe le stringhe come argomenti allo stesso comando.

for X in composer sismo; do 
    echo "php/$X"     # replace 'echo' with your command 
done 

Si potrebbe, tuttavia, riscrivere come

ARGS="$(for X in composer sismo; do echo "php/$X"; done)" 
echo $ARGS       # replace 'echo' with your command 

noti che $ARGS è non quotati nel comando sopra, ed essere consapevoli che questo significa che il suo contenuto è wordsplitted (cioè se tutte le vostre stringhe originali contenere spazi, si romperà).

Problemi correlati