Эта строка (357 \ 273 \ 277) указывает, что ваш CSV-файл закодирован с помощью Порядок следования байтов (BOM) в начале файла. Команда read
не интерпретирует спецификацию как имеющую особое значение, она просто передает необработанные символы, поэтому вы видите их как часть вашего вывода.
Поскольку вы не указали, как генерируется ваш исходный файл, вы можете изменить параметры на этом конце, чтобы предотвратить запись спецификации, что во многих случаях является необязательным. Кроме того, вы можете обойти это различными способами на стороне сценария. Оба эти вопроса предлагают несколько примеров:
Как удалить спецификацию из файла UTF-8?
Команда Cygwin не нашла плохих символов, найденных в .bashrc 357 \ 273 \ 277
Но, честно говоря, если вы просто последуете совету Чарльза Даффи и пропустите свой файл через dos2unix перед его разбором, он автоматически очистит его для вас. i.e.:
...
array=()
dos2unix $INPUT
while IFS="," read var1 var2 ; do
...
Или, опираясь на версию Чарльза:
#!/usr/bin/env bash
case $BASH_VERSION in ''|[123].*) echo "ERROR: Bash 4.0+ needed" >&2; exit 1;; esac
INPUT="IPPairs.csv"
declare -A pairs=( )
dos2unix $INPUT
while IFS=$',\r' read -r var1 var2 _ ; do
pairs[$var1]=$var2
done <"$INPUT"
for ip1 in "${!pairs[@]}"; do
ip2=${pairs[$ip1]}
# Using printf %q causes nonprintable characters to be visibly shown
printf 'Processing pair: %q and %q\n' "$ip1" "$ip2" >&2
done
Обратите внимание, что запуск dos2unix в вашем сценарии не обязательно является наилучшим подходом, поскольку файл необходимо преобразовать только один раз. Вообще говоря, это ничего не должно навредить, особенно с таким маленьким файлом. Тем не менее, лучшим подходом было бы запустить dos2unix как часть любого процесса, отправляющего ваш csv на сервер, и исключить его из этого сценария.