Двойная переменная в bash - PullRequest
0 голосов
/ 10 марта 2020
#! /bin/bash

source_id="1 2 3 4 5 "
target_id="one two three four five"


for $target_id in ${!source_id[*]}
do
    echo " id " $target_id is " name is "${source_id[$targetid]}
done

Я хочу напечатать:

name is 1 id is one  
name is 2 id is two

и так далее ...

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

bash v4 +, решение с ассоциативными массивами:

Если у вас bash версия больше 4, этот способ может быть лучше:

target_id=(
    ["1"]="one"
    ["2"]="two"
    ["3"]="three"
    ["4"]="four"
    ["5"]="five"
)

for source_id in ${!target_id[*]}
do
    echo "name is ${target_id["${source_id}"]} id is "${source_id}""
done

Здесь читайте больше об ассоциативном массивы в bash: Ассоциативные массивы в bash

Решение с регулярными массивами:

source_id=(1 2 3 4 5)
target_id=("one" "two" "three" "four" "five")

array_len="${#source_id[@]}"

for (( index = 0 ; index < "${array_len}" ; index++ ))
do
    echo "name is ${target_id[${index}]} id is ${source_id[${index}]}"
done

Вы можете прочитать о bash массивах здесь: bash массивы

0 голосов
/ 10 марта 2020

Вы можете сделать то, что намереваетесь, таким простым способом:

#!/bin/bash

source_id='
1 one
2 two
3 three
4 four
5 five'

echo "$source_id" | sed '/^ *$/d' | while read id name
do
    echo "id is $id and name is $name"
done

Если по какой-то причине вам НУЖНО использовать массивы, это правильный синтаксис для него:

#!/bin/bash

source_id=(1 2 3 4 5)
target_id=(one two three four five)

for (( i=0; i < "${#source_id[@]}" ; i++))
do
    echo "id is ${source_id[$i]} and name is  ${target_id[$i]} " 
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...