2015-04-16 5 views
1

Далее будет читать из внешнего файла и вывода данных:Справочные данные внутри Баш скрипт

#!/bin/bash 

while IFS='|' read hostname nickname; do 

echo $hostname $nickname 

done < "list.dat" 

Если файл list.dat является:

firstserver|joe 
secondserver|henry 
thirdserver|jack 

Но я хотел бы на самом деле храните list.dat в самом скрипте (не внешне), но не знаю, как ссылаться на него как переменная/массив и читать с него с теми же результатами ...

ответ

2

Here strings передать переменную или строку, как я думаю, что вы хотите:

#!/bin/bash 
input="firstserver|joe 
secondserver|henry 
thirdserver|jack" 

while IFS='|' read hostname nickname; do 

echo $hostname $nickname 

done <<< "$input" 
+0

Это похоже на работу, но не с пространством после ввода и = – Dan

+0

Исправлено, спасибо, что указали его. Цитата «$ input» также является хорошей идеей. –

+0

Имейте в виду, что в bash перед ошибкой 4 есть ошибка, которая может вызвать проблемы с объединением локальной настройки 'IFS' с этой строкой. Использование документа здесь может быть более безопасным. – chepner

6

Попробуйте использовать here document:

#!/bin/bash 
while IFS='|' read hostname nickname; do 
echo $hostname $nickname 
done <<LIMIT 
firstserver|joe 
secondserver|henry 
thirdserver|jack 
LIMIT 
+0

Конечно, если ваши значения не обязательно должны содержать пробелы, имеет смысл использовать пробелы в качестве разделителя. Тогда вам не нужно гадать с 'IFS' вообще. – tripleee

+0

Ваше решение также работает, спасибо за предложение, я не знал о «here-document». – Dan

2

Если Баш 4 доступен для вас, я хотел бы использовать ассоциативный массив:

declare -A servers=(
    ["firstserver"]=joe 
    ["secondserver"]=henry 
    … 
) 

for hostname in "${!servers[@]}"; do 
    echo "$hostname" "${servers[$hostname]}" 
done 

Это предполагает, что имена хостов уникальны.

Смежные вопросы