Sto sbirciando attraverso alcuni script di shell - qual è lo scopo della x nella shcu comarison come
if [ "x$USER" != "x$RUN_AS_USER" ]; then
su - $RUN_AS_USER -c "$CATALINA_HOME/bin/startup.sh"
else
$CATALINA_HOME/bin/startup.sh
fi
Sto sbirciando attraverso alcuni script di shell - qual è lo scopo della x nella shcu comarison come
if [ "x$USER" != "x$RUN_AS_USER" ]; then
su - $RUN_AS_USER -c "$CATALINA_HOME/bin/startup.sh"
else
$CATALINA_HOME/bin/startup.sh
fi
È un trucco assicurarti di non ottenere una stringa vuota nella sostituzione se una delle variabili è vuota. Inserendo x
su entrambi i lati è come se si confrontassero direttamente le variabili, ma i due lati restano sempre non vuoti.
E 'un vecchio kludge che ha reso più senso quando gli script sono stati scritti come:
if [ x$USER != x$RUN_AS_USER ]
lì, se hai appena avuto $USER
ed erano vuoti allora si potrebbe finire con
if [ != root ] # Syntax error
Con il x
si ottiene questo, che è meglio:
if [ x != xroot ]
Tuttavia, quando le variabili sono quotate, lo x
non è necessario poiché una stringa vuota tra virgolette non viene completamente rimossa. Si presenta ancora come un token. Quindi
if [ "$USER" != "$RUN_AS_USER" ] # Best
è il modo migliore per scrivere questo. Nel peggiore dei casi, con entrambe le variabili svuotano si otterrebbe questo che è una dichiarazione valida:
if [ "" != "" ]
E non importa se '$ USER' è '-f' perché ci sono tre argomenti da testare, quindi deve essere una disuguaglianza e non un'operazione di test dei file. –
Se le variabili sono una stringa vuota o non inizializzata , senza il x
il if
sarebbe simile questo dopo la sostituzione variabile:
if [ != ]; then
e quindi sarebbe sicuro perché gli operandi sono mancanti. Con il x
, il if
assomiglia a questo:
if [ x != x]; then
che è sintatticamente valido.
Il problema è legato a valori dispari-sfera, come suggerisce Cristian Ciupitu, ma stringhe vuote non sono il problema (almeno, non quando il valore nel suo complesso è quotato). Il problema è legato ai nomi che potrebbero essere confusi con gli operatori da testare (o '[
'; in alcuni sistemi, esiste davvero un programma /bin/[
). Lo standard POSIX ha quasi reso questo ridondante, ma considera cosa succede se "$ USER" è "-f", "$ RUN_AS_USER" è vuoto e le x e le virgolette non vengono utilizzate.
if [ -f != ]
then : someone has a file called '!='
else : they don't have a file called '!='
fi
Utilizzando le virgolette e la x iniziale, questo tipo di interpretazione errata viene evitato.
È già stato chiesto e risposto (anche più volte, suppongo) – soulmerge
@soulmerge: collegamenti per favore –
Il collegamento è visibile a coloro che possono chiudere le domande. Li posterò insieme al commento da ora in poi: http://stackoverflow.com/questions/1398994/shell-script-test – soulmerge