I had the below input file and a script whose logic was to process each line of the input file. Within the logic, I needed to perform an OS command such as the “more /etc/oratab” command below.
Contents on the input file:
[server_name] more temp.txt a b c
Code
#! /bin/bash
function perform_logic
{
echo '***'
temp=`more /etc/oratab | grep -i dean | wc -l`
}
while IFS=',' read -r service lsnr port
do
echo $service $lsnr $port
perform_logic
done < temp.txt
I was expecting three lines of output; one for each line in the input file. However, the output was:
[server_name] ./temp.ksh a *** [server_name]
Basically processing stops after the first line of the input file. The issue is that the “more /etc/oratab” is overlaying the standard input/output of the while command. After I changed the code to:
#! /bin/bash
function perform_logic
{
echo '***'
temp=`more /etc/oratab | grep -i dean | wc -l`
}
while IFS=',' read -r –u3 service lsnr port
do
echo $service $lsnr $port
perform_logic
done 3< temp.txt
Now the output displays that all lines of the input file are processed:
[server_name] ./temp.ksh
a
***
b
***
c
***
[dt2ompd2-splunk2]
#! /bin/bash
clear
function perform_logic
{
echo '***'
temp=`more /etc/oratab | grep -i dean | wc -l`
}
while IFS=',' read -r -u3 service lsnr port
#while IFS=',' read -r service lsnr port
do
echo $service $lsnr $port
perform_logic
done 3< temp.txt
#done < temp.txt
[dt2ompd2-splunk2] ./temp.ksh
a
***
[server_name]