Как передать параметры функции в скрипте bash?

14

Я хотел бы написать функцию, которую я могу вызвать из скрипта с множеством различных переменных. По некоторым причинам у меня много проблем с этим. Примеры, которые я читал, всегда используют глобальную переменную, но это не сделает мой код более читабельным, насколько я могу видеть.

Пример использования по назначению:

#!/bin/bash
#myscript.sh
var1=$1
var2=$2
var3=$3
var4=$4

add(){
result=$para1 + $para2
}

add $var1 $var2
add $var3 $var4
# end of the script

./myscript.sh 1 2 3 4

Я попытался использовать $1и такой в ​​функции, но потом он берет глобальный, из которого был вызван весь скрипт. В основном то , что я ищу что - то вроде $1, $2и так далее , но в локальном контексте функции. Как вы знаете, функции работают на любом правильном языке.

user181822
источник
Используя $ 1 и $ 2 в вашем примере, добавьте функцию «работает». Попробуй echo $1и echo $2в этом.
Виланд
Мой пример был ужасно неполным, я обновил его кучу. Теперь это не сработает.
user181822
Замените ваш result = на result=$(($1 + $2))и добавьте echo $resultпосле него, и он будет работать правильно, $ 1 и $ 2 - ваши аргументы функций.
Виланд

Ответы:

18

Чтобы вызвать функцию с аргументами:

function_name "$arg1" "$arg2"

Функция ссылается на переданные аргументы по их позиции (не по имени), то есть $ 1, $ 2 и т. Д. $ 0 - это имя самого скрипта.

Пример:

#!/bin/bash

add() {
    result=$(($1 + $2))
    echo "Result is: $result"
}

add 1 2

Выход

./script.sh
 Result is: 3
Рахул
источник
2
Теперь я осознаю свою ошибку. Я использовал $ 0 и $ 1 в функции, а $ 0 действительно разрешил имя сценария. Я принял его за параметр скрипта, а не за саму функцию. Спасибо!
user181822
6

В основном скрипте $ 1, $ 2 представляет переменные, как вы уже знаете. В индексах или функциях $ 1 и $ 2 будут представлять параметры, передаваемые в функции, как внутренние (локальные) переменные для этих индексов.

#!/bin/bash
#myscript.sh
var1=$1
var2=$2
var3=$3
var4=$4

add(){
  #Note the $1 and $2 variables here are not the same of the
  #main script... 
  echo "The first argument to this function is $1"
  echo "The second argument to this function is $2"
  result=$(($1+$2))
  echo $result

}

add $var1 $var2
add $var3 $var4
# end of the script


./myscript.sh 1 2 3 4
Лучано Андресс Мартини
источник