(6 risposte)
Chiuso 6 anni fa.
Questo fa parte di un bash find
loop, e mi sono chiesto quale sia la sintassi più corretta e perché?
filename="$(echo "$i" | cut -c5-)";
filename=`echo "$i" | cut -c5-`;
Entrambi funzionano allo scopo di ottenere il nome del file.
Risposta accettata:
Il manuale di Bash rileva che:
Viene implementata la forma POSIX $() di sostituzione dei comandi (vedi Sostituzione dei comandi) e preferita alla shell Bourne " (che è implementata anche per la compatibilità con le versioni precedenti).
Quindi $(...)
è preferito a `...`
in qualcosa di nuovo e specifico di Bash che stai scrivendo¹. La sostituzione del backtick non si annida bene (devi evitarli) e ha un comportamento di citazione leggermente strano. Puoi annidare $(... $(...) ...)
arbitrariamente molto senza problemi. Il manuale descrive il comportamento dei due come:
Quando viene utilizzata la forma di sostituzione del backquote vecchio stile, la barra rovesciata mantiene il suo significato letterale tranne quando è seguito da "$", "`" o "". Il primo backquote non preceduto da una barra rovesciata termina la sostituzione del comando. Quando si utilizza il modulo $(comando), tutti i caratteri tra parentesi costituiscono il comando; nessuno viene trattato in modo speciale.
Di solito è considerata una buona pratica citare tutte le espansioni delle stringhe per evitare problemi di divisione delle parole, anche in punti in cui non è strettamente richiesto, quindi "$(...)"
è anche una pratica migliore qui.
Infine, due parti rilevanti da quella stessa pagina wooledge:
- È ora che ti dimentichi di
`...`
. Non è coerente con la sintassi di Expansion ed è terribilmente difficile da annidare senza una dose di antidolorifici. Usa$(...)
invece.- E per carità, "Usa più virgolette!" Proteggi le tue stringhe e le espansioni dei parametri dalla divisione delle parole. La divisione delle parole mangerà i tuoi bambini se non citi le cose correttamente.
¹In realtà, anche in POSIX sh
script, questi sono considerati best practice. Ci sono ancora proiettili più deboli in giro, ma saprai se li incontrerai.