Назначение параметров для функций в Shell Script - PullRequest
0 голосов
/ 02 октября 2018

Я недавно начал учиться кодировать Shell Script, и одна вещь, которая меня смущает, это порядок назначения параметров.

Это код, который я путаю с

#!/bin/bash
Expression() 
{
    local num3=$1
    local num4=$2
    local num5=$3
    local sum=$(((num3-num4)+num5))
echo $sum
}
num1=5
num2=3
num3=7
sum=$(Expression num1 num2 num3)
echo "The result is $sum"

Вместополучая вывод как

The result is 9

Так как 5-3 + 7 = 9

Я получаю это как

The result is 7

Может кто-нибудь объяснить это, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Проблема в выражении

sum=$(Expression num1 num2 num3)

, где вы передаете литерал значения num1, num2 и num3 в виде строк.В этом примере эти переменные передаются не как заполнители для определенных значений, а как необработанные строки.

Вам необходимо передать их как фактические заполнители, содержащие эти значения, поставив $ перед именем переменной

sum=$(Expression "$num1" "$num2" "$num3")

Полагаю, вы приняли неверное решение: конструкция арифметического оператора $((..)) в bash позволяет получить доступ к переменным без введенного префикса $.Но для синтаксиса подстановки команд $(..) требует, чтобы имена переменных имели префикс $, иначе только литеральное значение передается, как вы видели здесь.

Что касается значения 7, оно должноОчевидно, что num3 определен как глобальный, так и local внутри функции.Таким образом, он содержит значение 5, поэтому операция 5-3+5 выполняется над 5-3+7, который вы ожидали.

0 голосов
/ 02 октября 2018

Вы должны поместить $ перед переменными:

sum=$(Expression $num1 $num2 $num3)

Здесь происходит то, что вы передаете имена переменных, а не значения.Давайте посмотрим на упрощенную версию вашей программы

#!/bin/bash                                                                                                                                                                                                                                                                     
Expression()
{
    local num5=$1
    echo $((num5))
}
num3=7
echo "The result is $(Expression num3)"

Вы передаете текст num3, а не значение 7.Оператор $(()) пытается оценить числа.num5 не число, а переменная.Таким образом, оно заменяется значением num3.num3 не является числом, поэтому оно заменяется значением 7.

Вы можете вложить это, вывод будет 5.

#!/bin/bash                                                                                                                                                                                                                                                                     
num1=num2
num2=num3
num3=num4
num4=5
echo $((num1))

Вы также можете попробоватьэто:

#!/bin/bash                                                                                                                                                                                                                                                                     
num1=num2
num2=num3
num3=num4
num4=num1
echo $((num1))

Результат равен

line 6: num4: expression recursion level exceeded (error token is "num4")

Таким образом, оценка действительно рекурсивная, пока не будет достигнуто число или предел.

0 голосов
/ 02 октября 2018

Правильный код:

#!/bin/bash
Expression() 
{
    local num4=$1
    local num5=$2
    local num6=$3
    local sum=$((((num4-num5))+num6))
echo $sum
}
num1=5
num2=3
num3=7
sum=$(Expression num1 num2 num3)
echo "The result is $sum"

Вывод:

./script.sh
The result is 9

Почему ваш код не работает?Когда вы запустите свой код с опцией bash -x, вы увидите разницу:

$ bash -x ./script.sh
+ num1=5
+ num2=3
+ num3=7
++ Expression num1 num2 num3
++ local num3=num1
++ local num4=num2
++ local num5=num3
++ local sum=7
++ echo 7
+ sum=7
+ echo 'The result is 7'
The result is 7

num3 объявлен как локальной, так и глобальной переменной.Поскольку функция использует локальное значение, используется значение 5 вместо 7, как вы ожидали.

...