Mon problème:
#!/bin/bash
function testFunc(){
echo "param #1 is :" $1
echo "param #2 is :" $2
}
param1="param1"
param2="param2"
testFunc $param1 $param2
De cette façon, la sortie est:
param #1 is : param1
param #2 is : param2
Mais quand je mets param1 sur une chaîne vide:
param1=""
La sortie est alors la suivante:
param #1 is : param2
param #2 is :
Je suppose que le problème est que lorsque le premier paramètre est vide, il n'est pas déclaré, il n'est donc pas passé en tant que paramètre de fonction.
Si tel est le problème, existe-t-il un moyen de déclarer une variable "chaîne vide" dans bash, ou existe-t-il une solution pour obtenir le comportement attendu?
Remarque: Cela fonctionne comme prévu si j'appelle la fonction comme ceci:
testFunct "" $param2
Mais je veux garder le code propre.
MISE À JOUR:
J'ai récemment découvert le -u
drapeau qui déclenche une erreur au cas où une variable non liée est sur le point d'être utilisée.
$ bash -u test.sh
param #1 is : param1
test.sh: line 5: $2: unbound variable
Dans le premier cas, vous appelez le script avec testFunct param2
. Par conséquent, il comprend param2
comme premier paramètre.
Il est toujours recommandé de passer des paramètres entre guillemets pour éviter cela (et pour être honnête, pour moi, c'est plus propre de cette façon). Vous pouvez donc l'appeler
testFunct "$param1" "$param2"
Donc, pour passer une variable vide, vous dites:
testFunct "" "$param2"
Voir un exemple:
Compte tenu de cette fonction:
function testFunc(){
echo "param #1 is -> $1"
echo "param #2 is -> $2"
}
Appelons cela de différentes manières:
$ testFunc "" "hello" # first parameter is empty
param #1 is ->
param #2 is -> hello
$ testFunc "hey" "hello"
param #1 is -> hey
param #2 is -> hello
Une autre meilleure pratique consiste à vérifier le nombre de paramètres transmis à l'aide de $ #.
Cependant, cela ne résout pas le problème d'un paramètre vide, comment sauriez-vous si le param1 est vide ou param2 est vide. Par conséquent, les deux contrôles sont de bons indices.