Hai correttamente passando una stringa vuota argomento alla sceneggiatura.
È lo script disordinarne:
#!/bin/bash
/home/myapp $1 $2
Lo script non protegge l'espansione di $1
e $2
da word-splitting. Ciò significa che se $1
e $2
contengono più parole, queste si trasformano in singoli argomenti, e se uno di essi si espande in nulla, semplicemente scompaiono.
Questo dovrebbe essere:
#!/bin/bash
/home/myapp "$1" "$2"
In generale, è possibile rendere il vostro script passare tutti i suoi argomenti per il programma invocato, in questo modo:
/home/myapp "[email protected]"
le virgolette sono solo guscio sintassi; non fanno parte dei dati dell'argomento stesso. Quando si digita program ""
nella shell, a livello di sistema operativo, il programma riceve una stringa di linguaggio C vuota: un puntatore a un byte null. Non ci sono citazioni.
È possibile passare l'argomento ""
(una stringa di due caratteri composta da due virgolette) ma non è un argomento vuoto. Un modo per farlo è, ad esempio, '""'
: racchiuderlo tra virgolette singole.
L'unico motivo per fare cose del genere è quando si sta manipolando la sintassi della shell in un meta-livello: passando intorno pezzi di script di shell codice sorgente, come i token citati, vuoti o in altro modo. La shell ha un comando chiamato eval
che accetta il codice sorgente come argomento (o più argomenti) e lo valuta.
empty_shell_string_syntax='""' # this variable holds the characters ""
eval empty_var=$empty_shell_string_syntax # empty_var gets set to empty string
prima che venga invocato il eval
, la riga di comando è soggetta ad espansione. Quell'espansione rimuove la sintassi $empty_shell_string_sytnax
e la sostituisce con il contenuto, i caratteri ""
. Quindi eval ottiene la stringa empty_var=""
. Valuta questo, e quindi empty_var
è impostato sulla stringa vuota, come indica la sintassi.
Perfetto, esattamente ciò di cui avevo bisogno Grazie! – Josh
Impostare 'arg2 = '" "" 'sembrerà corretto quando lo fai eco, ma se provi ad usarlo per passare una stringa vuota a qualcos'altro (come in'/home/myapp $ 1 $ arg2'), ha vinto' t lavoro - passerà la stringa composta da due virgolette, non una stringa vuota. –
@GordonDavisson * Voglio conservare questa stringa vuota ed eseguire invece: '/ home/myapp arg1" "' * Non è esattamente ciò che l'OP sta chiedendo? –