Вложение, если условие внутри цикла - PullRequest
1 голос
/ 14 мая 2019

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

#!/bin/bash

# Define File

datafile=./regions-with-keys

# Create Nodes File

cat << EOF > $datafile

region1 key1
region2 key2
region3 key3



EOF


# User Input
clear;
echo -ne "PLEASE SELECT REGIONS(s) :\n\033[37;40m[Minimum 1 Region Required]\033[0m"

read -ra a
echo "${a[@]}"


# Reading Regions & Keys

for i in "${a[@]}"
do
    while read -r $b $c; do

        if [ "${a[@]}" -eq "$b" ]; then
            echo "$b" "$c"
        fi

    done < $datafile
done;

выдает команду не найденную для оператора if при выполнении .. Цель кода - сопоставить индексы массива userinput с $ a из $ datafile, если совпадение выполнено. Print $ b и $ c

1 Ответ

1 голос
/ 14 мая 2019

Попробуйте это Shellcheck -чистый код:

#!/bin/bash -p

# Define File
datafile=./regions-with-keys

# Create Nodes File
cat <<EOF >"$datafile"
region1 key1
region2 key2
region3 key3
EOF

# User Input
clear
echo 'PLEASE SELECT REGIONS(s) :'
echo -ne '\e[37;40m[Minimum 1 Region Required]\e[0m'

read -ra input_regions
declare -p input_regions

# Reading Regions & Keys
for input_rgn in "${input_regions[@]}" ; do
    while read -r data_rgn key ; do
        if [[ $data_rgn == "$input_rgn" ]] ; then
            printf '%s %s\n' "$data_rgn" "$key"
        fi
    done <"$datafile"
done

Существенные изменения в коде вопроса:

  • Используйте значимые имена переменных.
  • Используйте declare -p input_regions для однозначной печати содержимого массива.
  • Используйте varname вместо $varname в качестве аргументов read.Это исправляет серьезную ошибку в исходном коде.
  • Используйте printf вместо echo для печати значений переменных.См. Почему printf лучше, чем echo? .
  • Используется [[ ... == ...]] вместо [ ... -eq ... ] для сравнения имен регионов.
    [[ ... ]] является более мощным, чем [ ... ].См. Являются ли двойные квадратные скобки [[]] предпочтительнее одиночных квадратных скобок [] в Bash? .Кроме того, -eq предназначен для сравнения целых чисел, а == (или, что эквивалентно, =) для сравнения строк.
  • Выполнены различные очистки (удалены некоторые пустые строки, удалены лишние точки с запятой, ...).
  • Новый код Shellcheck -чистый. Shellcheck выявил несколько проблем с исходным кодом.

Если вы хотите сообщить о неверных областях ввода, попробуйте заменить код «Чтение областей и ключей» следующим:

for input_rgn in "${input_regions[@]}" ; do
    # Find the key corresponding to $input_rgn
    key=
    while read -r data_rgn data_key ; do
        [[ $data_rgn == "$input_rgn" ]] && key=$data_key && break
    done <"$datafile"

    if [[ -n $key ]] ; then
        printf '%s %s\n' "$input_rgn" "$key"
    else
        printf "error: region '%s' not found\\n" "$input_rgn" >&2
    fi
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...