2012-03-11 6 views
3

Я работаю над скриптом, который извлекает данные из файла csv, манипулирует данными, а затем спрашивает пользователя, являются ли изменения правильными. Проблема в том, что вы не можете выполнить команду чтения внутри цикла while, который читает файл. Ниже приведен тестовый скрипт, обратите внимание, что файл должен быть создан, но он не используется. Это всего лишь отрывок из более крупного сценария, над которым я работаю. Я переписываю его, чтобы использовать массивы, которые, похоже, работают, но хотелось бы знать, есть ли что-то в этом роде? Я читал несколько руководств по bash, а страницы man для чтения и не нашли ответа. Заранее спасибо.Bash читает внутри цикла, читает файл

#!/bin/bash 
######### 
file="./in.csv" 
OLDIFS=$IFS 
IFS="," 
######### 

while read custdir custuser 
do 
    echo "Reading within the loop" 
    read what 
    echo $what 
done < $file 

IFS=$OLDIFS 
+0

вы можете найти 'awk' быть лучшим выбором для того, что вы пытаетесь сделать. –

ответ

7

Вы можете играть с файловыми дескрипторами, чтобы у вас все еще был доступ к старому стандартному вводу. Например, этот файл qq.sh будет читать сам и печатать каждую строку, используя свой read петлю, и также задать вопрос после каждой строки:

while read line 
do 
    echo " Reading within the loop: [$line]" 
    echo -n " What do you want to say? " 
    read -u 3 something 
    echo " You input: [$something]" 
done 3<&0 <qq.sh 

Он делает это первым сохранение стандартного ввода (дескриптор файла 0) в файл ручка 3 с 3<&0, затем используя read -u <filehandle> вариант для чтения из дескриптора файла 3. Простых транскриптов:

pax> ./qq.sh 
    Reading within the loop: [while read line] 
    What do you want to say? a 
    You input: [a] 
    Reading within the loop: [do] 
    What do you want to say? b 
    You input: [b] 
    Reading within the loop: [echo "Reading within the loop: [$line]"] 
    What do you want to say? c 
    You input: [c] 
    Reading within the loop: [echo -n "What do you want to say? "] 
    What do you want to say? d 
    You input: [d] 
    Reading within the loop: [read -u 3 something] 
    What do you want to say? e 
    You input: [e] 
    Reading within the loop: [echo "You input: [$something]"] 
    What do you want to say? f 
    You input: [f] 
    Reading within the loop: [done 3<&0 <qq.sh] 
    What do you want to say? g 
    You input: [g] 
    Reading within the loop: [] 
    What do you want to say? h 
    You input: [h] 
pax> _ 
+0

Спасибо, я уже собирался спросить, как это исправлено. Это сработало на небольшом тестовом скрипте, теперь для включения в настоящий скрипт. Еще раз спасибо. – SoulNothing