2017-02-15 7 views
0

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

splitDate $date day month year 

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

splitDate(){ 
    export IFS="/" 
    declare -a var 
    index=0 
    for word in $1; do 
     var[ $index ]=$word 

     ((index++)) 
    done 

    $2=${var[0]} 
    $3=${var[1]} 
} 

Когда я запускаю это я получаю эту ошибку «день = theValueIWant: команда не найдена» & «месяц = ​​theValueIWant: команда не найдена» Что здесь не так? тест: Если я обеспечиваю 04/05/2017 как дата я ожидаю день хранения 04 месяцев для хранения 05 & год для хранения 2017

+0

Можете ли вы представить пример с реальными значениями? Вход и ожидаемый результат? – Inian

+0

См. [Этот ответ] (http://stackoverflow.com/questions/540298/bash-passing-arguments-by-reference/2852445#2852445) – Julian

+0

Вы действительно уверены, что это то, что вы хотите? Печать вывода в виде последовательности токенов, чтобы вы могли записать его в переменные с помощью 'set --' или что бы, вероятно, лучше справлялись с общим дизайном оболочки. – tripleee

ответ

3

Вы можете просто использовать read. Аргументы read - это имена переменных для заполнения, которые могут быть созданы путем расширения параметров так же, как и жесткого кодирования.

splitDate(){ 
    if [[ $1 != ??/??/???? ]]; then 
     printf '%s\n' "Date not in dd/mm/yyyy format" >&2 
     return 1 
    fi 
    IFS=/ read -r "$2" "$3" "$4" <<< "$1" 
} 

, который поднимает вопрос, вам действительно нужна отдельная функция?

# splitDate "$currentDate" day month year 
#   vs 
# IFS=/ read -r day month year <<< "$currentDate" 
+0

'++' для демонстрации простоты снова. Было бы возможно, если бы я разделил '$ 1' на массив с'/'de-limiter и попытался определить другие значения параметров из массива, используя' declare' и не используя 'eval'? – Inian

+1

Вы могли бы; Я собирался опубликовать что-то вроде 'IFS =/read -a var <<<" $ 1 "; объявить «$ 2 = $ {var [0]}"; # и т. д. вместе с 'printf -v" $ 2 "'% s'" $ {var [0]} "', пока я не понял, что ничего, что 'read' не могло бы сделать так же хорошо. – chepner

+0

испытывал такой же, как 'splitDate() { местных dateValues ​​= ($ {1 // - /}) объявить "$ 2 = $ {dateValues ​​[0]}" объявить«$ 3 = $ {dateValues ​​[1 ]} " объявить" $ 4 = $ {dateValues ​​[2]} " } ' для функции и назвал ее как 'splitDate '$ (date +"% d-% m-% Y ")" day month year' но не смог заставить его работать. может быть, я что-то упустил. – Inian