2009-11-26 2 views
5

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 
+0

È già stato chiesto e risposto (anche più volte, suppongo) – soulmerge

+3

@soulmerge: collegamenti per favore –

+1

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

risposta

13

È 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 [ "" != "" ] 
+0

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. –

1

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.

6

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.