2013-10-15 20 views
13

mio problema:passaggio vuoto variabile in bash

#!/bin/bash 

function testFunc(){ 
    echo "param #1 is :" $1 
    echo "param #2 is :" $2 
} 

param1="param1" 
param2="param2" 

testFunc $param1 $param2 

questo modo l'uscita è:

param #1 is : param1 
param #2 is : param2 

Ma quando ho impostato param1 a stringa vuota:

param1="" 

L'uscita è il maggese:

param #1 is : param2 
param #2 is : 

Suppongo che il problema è che quando il primo parametro è vuoto, non è dichiarato, quindi in realtà non viene passato come parametro di funzione.

Se questo è il problema, c'è un modo per dichiarare una variabile "stringa vuota" in bash, o c'è qualche soluzione per ottenere il comportamento previsto?

Nota: Funziona come previsto se chiamo la funzione in questo modo:

testFunct "" $param2 

Ma voglio mantenere il codice pulito.

UPDATE:

di recente ho scoperto la bandiera -u che solleva un errore nel caso in cui una variabile non legata è in procinto di essere utilizzato.

$ bash -u test.sh 
param #1 is : param1 
test.sh: line 5: $2: unbound variable 
+1

Pulizia non deve ignorare la correttezza. – chepner

+1

Quindi preferisci mantenere il disordine corretto, invece di cercare una soluzione pulita e corretta? – kupsef

+1

Se il codice non è corretto, a chi importa se è pulito? Non citando un'espansione parametro perché ritieni che sia più pulito non è corretto. – chepner

risposta

25

Nel primo caso si chiama lo script con testFunct param2. Quindi, comprende param2 come primo parametro.

È sempre consigliabile passare i parametri tra virgolette per evitare questo (e ad essere onesti, per me è più pulito in questo modo). Così si può chiamare

testFunct "$param1" "$param2" 

Quindi, per passare una variabile vuota dici:

testFunct "" "$param2" 

vedere un esempio:

Data questa funzione:

function testFunc(){ 
    echo "param #1 is -> $1" 
    echo "param #2 is -> $2" 
} 

Chiamiamolo in diversi modi:

$ testFunc "" "hello" # first parameter is empty 
param #1 is -> 
param #2 is -> hello 

$ testFunc "hey" "hello" 
param #1 is -> hey 
param #2 is -> hello 
+1

Alcuni sostengono che idealmente anche '$ 1' e' $ 2' nel comando 'echo' dovrebbero essere quotati. – user000001

+1

E avrebbero ragione. Grazie @ user000001! – fedorqui

1

Un'altra best practice è controllare il numero di parametri passati utilizzando $ #.

Tuttavia, questo non risolve il problema di un parametro vuoto, come sapresti se il param1 è vuoto o param2 è vuoto. Pertanto entrambi i controlli sono buoni parctices.

+0

Leggi la sezione di aggiornamento della mia domanda, presenta un modo più efficace per catturare questi bug. – kupsef