Looping on variable having new line \n fails


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Looping on variable having new line \n fails
# 1  
Old 08-29-2019
Looping on variable having new line \n fails

I have a for loop that constructs a variable "filelistonly" having entries separated by "\n" new line.

The second, third & fourth while loops are my attempt to iterate the variable "filelistonly" upon new line "\n", however non of them work.

Below is my script:

Code:
//First Loop
for i in $(echo $1 | tr ',' '\n')
do
    fileresult=`find $i -name hello.db -type f`
    filelistonly=$filelistonly`echo ${fileresult%:*}`"\n"
done

//Second Loop
while read -r line; do
echo "*** $line ***"
done <<< "$filelistonly"

//Third Loop
while read line; do
echo line="$line";
done < <(echo "$filelistonly" | tr ',' '\n')

//Fourth Loop
while read -r line; do
    if [ $line != "\n" ]; then
           echo "We are Good. $line File Found."
    else
        echo "New Line Found.... Ignoring"
    fi
done <<< "$filelistonly"

Below is the debug Output:

Quote:
# bash -x ./test.sh /root,/tmp
++ echo /root,/tmp
++ tr , '\n'
+ for i in '$(echo $1 | tr '\'','\'' '\''\n'\'')'
++ find /root -name hello.db -type f
+ fileresult=/root/Music/hello.db
++ echo /root/Music/hello.db
+ filelistonly='/root/Music/hello.db\n'
+ for i in '$(echo $1 | tr '\'','\'' '\''\n'\'')'
++ find /tmp -name hello.db -type f
+ fileresult=/tmp/hello.db
++ echo /tmp/hello.db
+ filelistonly='/root/Music/hello.db\n/tmp/hello.db\n'
+ read -r line
+ echo '*** /root/Music/hello.db\n/tmp/hello.db\n ***'
+ read -r line
+ read line
++ echo '/root/Music/hello.db\n/tmp/hello.db\n'
++ tr , '\n'
+ echo line=/root/Music/hello.dbn/tmp/hello.dbn
line=/root/Music/hello.dbn/tmp/hello.dbn
+ read line
+ read -r line
+ '[' '/root/Music/hello.db\n/tmp/hello.db\n' '!=' '\n' ']'
+ echo 'We are Good. /root/Music/hello.db\n/tmp/hello.db\n File Found.'
We are Good. /root/Music/hello.db\n/tmp/hello.db\n File Found.
+ read -r line
The below code works and resolves the new line problem reported above however the if condition fails which is shown in debug below.
Code:
    filelistonly=$filelistonly`echo ${fileresult%:*}`$'\n'

Output showing if condition failing.....
Quote:
+ '[' /tmp/hello.db '!=' '\n' ']'
+ echo 'We are Good. /tmp/hello.db File Found.'
We are Good. /tmp/hello.db File Found.
+ read -r line
+ '[' '!=' '\n' ']'
./test.sh: line 22: [: !=: unary operator expected
+ echo 'New Line Found.... Ignoring'
New Line Found.... Ignoring
I guess the issue could be in the first loop where I'm constructing the variable "filelistonly", however I'm not sure of a solution yet.

Last edited by mohtashims; 08-29-2019 at 02:06 PM..
# 2  
Old 08-29-2019
try: if [ "$line" != "\n" ] in case $line is an empty string.

Last edited by rdrtx1; 02-18-2020 at 07:51 PM..
This User Gave Thanks to rdrtx1 For This Post:
# 3  
Old 08-29-2019
You can simplify your loops by controlling the special IFS variable. The shell itself can be told to split on newlines and only newlines, or on commas, or quotes, or whatever.

Code:
OLDIFS="$IFS"
# Yes, looks funny, but its a single newline in double-quotes
IFS="
"
STR="string
containing lots of
newlines and
stuff"

for X in $STR
do
        echo "X is $X"
done

# Restore normal splitting behavior
IFS="$OLDIFS"

Also, some of those echoes look redundant.

Code:
filelistonly="${filelistonly}${fileresult%:*}\n"

...and most of those \n's in your code aren't real newlines:

Code:
$ echo "\n"

\n

$

So I suspect a lot of your code isn't doing what you think it is.

Last edited by Corona688; 08-29-2019 at 02:49 PM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Expansion of variable inside Single Quotes Fails!!

I am unable to expand the value of entry variable inside the nawk command. I tried three different nawk command as below but none of them substitute the value of entry variable. ls *.txt | while IFS='' read -r entry; do #nawk '/<name>/{A=1;++i} A{print >> ("cmd"i"_"$entry)}... (9 Replies)
Discussion started by: mohtashims
9 Replies

2. Shell Programming and Scripting

sed variable expansion fails for substitution in range

I'm trying to change "F" to "G" in lines after the first one: 'FUE.SER' 5 1 1 F0501 F0401 F0502 2 1 F0301 E0501 F0201 E0502 F0302 3 1 F0503 E0503 E0301 E0201 E0302 E0504 F0504 4 1 F0402 F0202 E0202 F0101 E0203 F0203 F0403 5 1 F0505 E0505 E0303 E0204 E0304 E0506... (10 Replies)
Discussion started by: larrl
10 Replies

3. Shell Programming and Scripting

awk fails when using variable

This works when I try to execute normally : echo | format | nawk '/pci@1f,4000/{print x}; {x=$0 }' But fails when define a variable and put it in a file: cat test c=pci@1f,4000 echo | format | nawk "/$c/{print x}; {x=$0 }" ./test nawk: syntax error at source line 1 context is ... (6 Replies)
Discussion started by: aksijain
6 Replies

4. Shell Programming and Scripting

SH script, variable built command fails, but works at command line

I am working with a sh script on a solaris 9 zone (sol 10 host) that grabs information to build the configuration command line. the variables Build64, SSLopt, CONFIGopt, and CC are populated in the script. the script includes CC=`which gcc` CONFIGopt=' --prefix=/ --exec-prefix=/usr... (8 Replies)
Discussion started by: oly_r
8 Replies

5. Shell Programming and Scripting

looping and saving output of each line separately

I have been trying this program for a long time. I am trying to read a file named "odon" line by line; read the first line, send it to do a command saved in a file "perm", once the first line has finished going through the content of the file perm, the result is saved with the number of the line.... (17 Replies)
Discussion started by: iconig
17 Replies

6. Shell Programming and Scripting

how to start looping from the second line in .csv file

I have a .csv file and i use the below while loop to navigate through it But i need to loop from the second line since the first line is the header How will i do it?? please help while IFS=, read Filename Path size readonly do echo "Filename -> ${Filename}" echo "Path -> ${Path}" echo... (8 Replies)
Discussion started by: codeman007
8 Replies

7. Shell Programming and Scripting

Looping through each line of text file

Dear all, I have a text file like below. eg.txt abcd efgh ijkl mnop I need a script, which should read the text file eg.txt and assign each line as a parameter. This , i wil use further to pass it a java command to invoke. All inside a for loop Need your help on this. With... (2 Replies)
Discussion started by: KrishnaSaran
2 Replies

8. Shell Programming and Scripting

csh fails when setting variable

I have a csh that is called from autosys. It fails when it hits this code env | grep Rep if ( $status == 0 ) then echo "" else setenv REP "" endif However if I run it from the command line, as opposed to from autosys (job schduler) it runs fine. I thought it might be some kind of... (2 Replies)
Discussion started by: gillbates
2 Replies

9. Shell Programming and Scripting

looping through a variable in a shell script

hi, my first question is :- i would like to know how do i loop through the output of a variable. for ex:- if i have a variable called x and echo $x gives the output like feb 19 07 feb 20 07 feb 21 07 i would like to know how do i loop through this since it is separated and i... (1 Reply)
Discussion started by: ramachandranrr
1 Replies

10. Shell Programming and Scripting

Looping and conditional branching on the command line

I am piping STDOUT from commands such as ifconfig and dmesg through grep, sed and awk to get the information I need. I need to now perform some looping and branching now and have been trying to figure out how to do this on the command line. You may ask "Why the command line? - Why not put it... (2 Replies)
Discussion started by: karlgo
2 Replies
Login or Register to Ask a Question