Передать пустую переменную в bash
моя проблема:
#!/bin/bash
function testFunc(){
echo "param #1 is :" $1
echo "param #2 is :" $2
}
param1="param1"
param2="param2"
testFunc $param1 $param2
Таким образом, выход:
param #1 is : param1
param #2 is : param2
Но когда я устанавливаю param1 в пустую строку:
param1=""
Тогда вывод будет парой:
param #1 is : param2
param #2 is :
Я думаю, проблема в том, что когда первый параметр пуст, он не объявляется, поэтому он фактически не передается как параметр функции.
Если это проблема, то есть способ объявить переменную "пустая строка" в bash, или есть ли какое-либо обходное решение для получения ожидаемого поведения?
Примечание. Он работает как ожидалось, если я вызываю функцию следующим образом:
testFunct "" $param2
Но я хочу, чтобы код был чистым.
UPDATE:
Недавно я обнаружил флаг -u, который вызывает ошибку в случае, когда будет использоваться несвязанная переменная.
$ bash -u test.sh
param #1 is : param1
test.sh: line 5: $2: unbound variable
Ответы
Ответ 1
В первом случае вы вызываете script с testFunct param2
. Следовательно, он понимает param2
как первый параметр.
Всегда рекомендуется передавать параметры в кавычках, чтобы избежать этого (и, честно говоря, для меня это чище). Таким образом, вы можете назвать его
testFunct "$param1" "$param2"
Итак, чтобы передать пустую переменную, вы говорите:
testFunct "" "$param2"
См. пример:
Учитывая эту функцию:
function testFunc(){
echo "param #1 is -> $1"
echo "param #2 is -> $2"
}
Позвоните по-разному:
$ testFunc "" "hello" # first parameter is empty
param #1 is ->
param #2 is -> hello
$ testFunc "hey" "hello"
param #1 is -> hey
param #2 is -> hello
Ответ 2
Другая лучшая практика - проверить количество переданных параметров с помощью $#.
Однако это не решает проблему одного пустого параметра, как бы вы знали, является ли param1 пустым или param2 пуст. Поэтому обе проверки являются хорошими симметриями.