Подтвердить что ты не робот

Передать пустую переменную в 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
4b9b3361

Ответ 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 пуст. Поэтому обе проверки являются хорошими симметриями.