Bash-скрипты с IFS

Мне нужно в Bash с IFS=','

./test.sh Майк, Техас Ник, Торонто Лукас, Айова

Привет Майк

Вы из Техаса

Привет Ник

Вы из Торонто

Привет Лукас

Вы из Айовы

#!/bin/bash
    IFS=',' read -r -a array <<< "$string"


    for index in "${!array[@]}"
    do
            echo Hello "$index ${array[index]}"
            echo You are from "$index ${array[index]}"
    done

person Gemma Torrote    schedule 27.04.2018    source источник
comment
Пожалуйста, прочитайте как создать минимальный полный и проверяемый пример.   -  person LMC    schedule 28.04.2018
comment
вы должны уточнить, чего именно вы пытаетесь достичь.   -  person Noam Shaish    schedule 28.04.2018
comment
и ваш вопрос должен включать вашу лучшую попытку решить вашу проблему. Мы поможем вам исправить это, но мы не хотим делать это за вас. Удачи.   -  person shellter    schedule 28.04.2018
comment
Извините, вы абсолютно правы.   -  person Gemma Torrote    schedule 28.04.2018


Ответы (3)


Вам не нужно изменять IFS (внутренний разделитель полей), вам нужно расширение параметра с удалением подстроки, например.

#!/bin/bash

for i in "$@"; do
    printf "Hello %s\nYou are from %s\n" "${i%,*}" "${i#*,}"
done

Пример использования/вывода

$ ./test.sh Mike,Texas Nik,Toronto Lucas,Iowa
Hello Mike
You are from Texas
Hello Nik
You are from Toronto
Hello Lucas
You are from Iowa
person David C. Rankin    schedule 28.04.2018
comment
Большое спасибо. Мне понравился твой ответ, он очень изобретателен. Чего я не понимаю, так это... (%, *) и (# *,) Можете мне это объяснить? Еще раз спасибо - person Gemma Torrote; 28.04.2018
comment
Это называется расширением параметра с удалением подстроки. ${var#*,} обрезает строку в var СЛЕВА до первой запятой включительно, ${var%,*} делает то же самое СПРАВА (обратите внимание на расположение подстановочного знака '*'). Вы можете использовать ${var##*,}, чтобы обрезать СЛЕВА до последней запятой включительно, и то же самое СПРАВА с помощью ${var%%,*}. Это объясняется под заголовком Расширение параметров в man bash. - person David C. Rankin; 28.04.2018
comment
Если он ответил на ваш вопрос, см. Что мне делать, когда кто-то ответит на мой вопрос? - person David C. Rankin; 28.04.2018

Вы можете перебрать аргументы, используя только for argument - это заполнит переменную с именем argument аргументами, разделенными пробелами, по одному. Затем вы можете прочитать значения, разделенные запятыми. Например:

set -- Mike,Texas Nik,Toronto Lucas,Iowa # For testing purposes
for argument
do
    IFS=, read name state <<< "$parameter"
    echo "Hello ${name}"
    echo "You are from ${state}"
done
person l0b0    schedule 29.04.2018

Основываясь на том, что я вижу, вот мое предложение:

for i in $* ; do

     name=$(echo $i | awk -F, '{print $1}' )
     wherefrom=$(echo $i | awk -F, '{print $2'})

     echo Hello $name, you are from $wherefrom
done
person Leonard    schedule 28.04.2018
comment
Почему две awk? echo $i | awk -F, '{print "Hello",$1,"you are from " $2}'. Кстати, for i будет достаточно (вам не нужно in $*). - person cdarke; 28.04.2018
comment
Большое спасибо. Ваш ответ был очень успешным. - person Gemma Torrote; 28.04.2018
comment
cdarke - Ваше решение и мое работают. Ваш более лаконичен и, следовательно, для данной задачи, вероятно, лучше. Мое решение извлекает имя и место назначения в переменные, что может быть полезно в более сложном контексте. - person Leonard; 28.04.2018