Рейтинг:0

Как переназначить позиционный аргумент, чтобы он был доступен вне функции?

флаг us

Я пытаюсь создать функцию string_split, совместимую с #!/bin/sh, которая имеет синтаксис команды, аналогичный команде чтения, чтобы вы могли передать строку, которую хотите разделить, и переменные, которые вы хотите также назначить строкам.

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

#!/бин/ш
split_str() {
    input_original=$1
    ввод=$1
    input_delimiter=$2

    input=$(echo "$input" | sed -e "s/$input_delimiter//g")
    установить -- "$input_original" "$input_delimiter" $input
}

Желаемое использование команды будет выглядеть так:

split_str "Привет, мир" " " слово1 слово2
эхо "$ слово1"
# Вывод: привет
эхо "$слово2"
# Выход: мир

Решение

Используя приведенный ниже ответ bac0ns, я смог получить это решение, которое работает с любым количеством переданных выходных параметров. Спасибо за помощь @bac0n

#!/бин/ш
split_str() {
    ввод=$1
    input_delimiter=$2
    
    # Изолировать выходные параметры
    output_params=$(echo "${@}" | sed -e "s/$input $input_delimiter//g")

    # Добавьте дополнительный аргумент переменной, чтобы поймать любое переполнение.
    # Это предотвращает добавление каких-либо дополнительных частей подстроки к
    # переданные параметры. 
    output_params="переполнение $output_params"

    # Разделить строку, прочитав значения с помощью read
    IFS="$input_delimiter" читать -r $output_params << EOF
1 доллар
EOF
}
kevincorrigan avatar
флаг us
@Terrance Можете ли вы рассказать об этом подробнее? Если я добавлю return $input в свою функцию, я получаю сообщение об ошибке. "требуется числовой аргумент"
Terrance avatar
флаг id
Извините за это, я использую это, чтобы вернуть 0 или 1, когда я вызываю свои функции, если они истинны или ложны.
bac0n avatar
флаг cn
/bin/sh (тире) является требованием?
kevincorrigan avatar
флаг us
@bac0n Да, /bin/sh требуется.
Рейтинг:2
флаг cn

Функции выполняются в том же контексте, что и текущая оболочка, совершенно нормально установить слово1 и слово2 внутри функции и использовать их из области вызова:

расколоть(){
    местный а=$1 б=$2
    смена 2
    IFS=$b читать -r $@ _ << \
EOF
    $а
EOF
}

разделить "привет мир" " " слово1 слово2

printf %s\n "1:$word1" "2:$word2"
kevincorrigan avatar
флаг us
Спасибо! Это было не совсем то, что мне нужно, но это указало мне правильное направление. Я обновлю свой вопрос своей новой функцией.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.