le diciamo che vuoi ripetere un carattere come ‘-‘ O ‘=‘ più volte durante la scrittura dello script bash. Nota che avevo bisogno di uno script veloce per lavorare su Linux, macOS e server FreeBSD per ripetere una stringa/carattere n volte. Un modo semplice per ripetere una stringa o un carattere n volte è utilizzare il comando echo/printf come segue:
echo '------------------------------------' printf '%sn' '------------------------------------'
Ma ci deve essere un modo migliore. Ad esempio, qui ci sono esempi classici di Perl e Python che ripetono ‘-’80 volte:
One-liner Python:
python -c 'print "-" * 80'
Come ripetere un carattere ‘n’ volte in Bash
Proviamo questo esempio di funzione Linux e Unix Bash per ripetere una stringa/carattere ‘n’ volte con l’aiuto di bash for loop come segue:
# Repeat given char 80 times using shell function repeat(){ for i in {1..90}; do echo -n "$1"; done }
Quindi tutto ciò che devo fare è chiamare repeat() come segue:
repeat '-' echo repeat '=' echo repeat '~'; echo -e 'nHEAD 1ttHead 2ttHead 3ttttHead 4'; repeat '~'; echo
La mia soluzione è semplice e amichevole. Ha risolto il mio problema. Eppure ora sto diventando avido. Volevo vedere se potevo usare printf/echo e replicare l’esperienza one-liner di Perl/Python.
Ripetere un carattere o una stringa n volte usando printf
Il printf è una shell integrata ed esterna /bin/printf, usata per formattare e stampare ARGUMENTS. La sintassi è:
printf 'FORMAT' var printf '%sn' 'Hello World' printf -- '-%.0s' 1 2 3 4 5 printf -- '-%.0s' {1..5} printf -- '-%.0s' {1..80}
In cui si,
- Il doppio trattino”--” significa “flag di fine riga di comando”. Visto che ho bisogno di stampare -, il doppio trattino (--) dice al comando printf di non provare ad analizzare ciò che viene dopo le opzioni della riga di comando.
- Bash si espande {1..5}. Per esempio, eco {1..5}, stampe 1 2 3 4 5. Così
printf -- '-%.0sn' {1..5}
diventa:
printf -- '-%.0sn' 1 2 3 4 5 - Il -%0s stampa singolo ‘-‘ dato 5 volte.
- È possibile rimuovere il doppio trattino (---‘. Ad esempio:
printf '~%.0sn' {1..80}
Nota di chiusura
Ho finito per usare quanto segue perché avevo bisogno di eseguire script sia su macOS/BSD che su Linux:
Guide solo per i sostenitori di Patreon ????
- Nessuna pubblicità e tracciamento
- Guide approfondite per sviluppatori e amministratori di sistema su Opensourceflare✨
- Unisciti al mio Patreon per supportare i creatori di contenuti indipendenti e iniziare a leggere le ultime guide:
# Repeat given char N times using shell function repeat(){ local start=1 local end=${1:-80} local str="${2:-=}" local range=$(seq $start $end) for i in $range ; do echo -n "${str}"; done }
Quindi lo eseguo come segue:
repeat 80 '-'; echo repeat 40 '='; echo # print Hello 5 times repeat 5 'Hello'; echo
Sono sicuro che qualcuno potrebbe inventare awk, sed, echo/printf e anche altre versioni. Ma, per ora, sono soddisfatto di quello che ho ottenuto. Come al solito, controlla le pagine man:man bash
help printf
man seq
ANNUNCIO