web-dev-qa-db-fra.com

Passer une variable vide dans bash

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
19
kupsef

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
31
fedorqui

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.

1
Tom Ron