bash для l oop в функции с передачей параметров - PullRequest
1 голос
/ 28 апреля 2020

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

Я хочу создать функцию с переменным числом параметров, которая должна быть распечатана с l для 1013 *. Переданные параметры являются печатаемыми строками. Выходными данными должно быть число «for l oop», начинающееся с 1, а затем переданный аргумент. Я не могу найти решение, чтобы сказать: напечатайте номер итерации, затем напечатайте параметр функции в позиции итерации.

Я всегда получаю ошибку: недопустимое число

Пожалуйста, извините путаница. СПАСИБО

это должно выглядеть так

SOME TEXT

1: String1
2: String2
3: String3
func()  {
 echo -e "SOME TEXT"

        for i in "$@"; do
            printf  '%d: %s\n' "$i" "$@"   # I also tried "${i[@]}"
        done

}

func String1 String2 String3


Ответы [ 2 ]

3 голосов
/ 28 апреля 2020

В вашем коде $i будет каждым аргументом, переданным функции. Это не может быть преобразовано в число согласно printf, поэтому он жалуется. Это потому, что $@ - это список всех аргументов, переданных функции. В вашем случае $@ содержит элементы String1, String2 и String3.

Вот что вы имеете в виду:

func(){
    echo -e "SOME TEXT"
    i=0
    for arg in "$@"; do
        i=$((i+1))
        printf '%d: %s\n' "$i" "$arg"
    done
}
func String1 String2 String3
0 голосов
/ 28 апреля 2020
func() {
    echo -e "SOME TEXT"
    for ((i=1; i<=$#; i++)); do
        eval str=\$$i
        printf '%d: %s %s\n' "$i" "$str" "${!i}"
    done
}

Использует косвенные ссылки для доступа к переменной. str - старый способ, ${!i} - новый сокращенный подход.

...