Script doesn't work in loop but does if not


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Script doesn't work in loop but does if not
# 1  
Old 08-02-2010
Script doesn't work in loop but does if not

I have a script that only works if I remove it from the looping scenario.

Code:
#!/bin/bash

# Set the field seperator to a newline
##IFS="
##" 

# Loop through the file
##for line in `cat nlist.txt`;do

# put the line into a variable.
##dbuser=$line

echo "copying plugin..."


deststr="/home/admin/aname.mydomain.com/wp-content/plugins/wp-stuff"

movestr="cp -R -p /home/wp-stuff "$deststr
$movestr

echo "done"

##done

This works fine. But if I remove the ##'s and change aname to $dbuser then it fails with "no such file or directory"

Even if I remove the ##'s but hard code the aname in, it still fails exactly the same.

If I convert it so that it takes a command line argument, so that $dbuser is fed in each time, then it still works without the loop.

Code:
#!/bin/bash
 
EXPECTED_ARGS=1
dbuser=$1

deststr="/home/admin/"$dbuser".mydomain.com/wp-content/plugins/wp-stuff"

movestr="cp -R -p /home/wp-stuff "$deststr
$movestr

But as soon as I try to do it with the loop, I get the error.

Since if I hardcode it but leave it in the loop, it doesnt work, but if I hardcode but remove the looping mechanism, then it works fine.

I would really appreciate some simple help. I am not proficient at linux, so please go easy on me. I am using centos 5 if it makes a difference.

Last edited by bugeye; 08-02-2010 at 07:31 PM..
# 2  
Old 08-02-2010
It would help to see at least the first few lines of your input .txt file. I'm guessing that it contains more than just the user name on each line. If that is the case then each space separated token on each record will be assigned to line and the loop executed. If your file contains three tokens per line (lets say a, b, and c for line 1), then the first time through the loop the deststr variable is assigned something like this:

Code:
/home/admin/a.mydomain.com/wp-content/plugins/wp-stuff

and that might not be a legitimate filename.


There are several ways that you can test for this, with the easiest being to echo the contents of deststr rather than executing the mv command. This would validate the contents of deststr and give you a better idea of what is going on.

If your input file does contain multiple columns of data, the following could be used to extract the proper column (column 3 in my example) and then do the right thing.

Code:
# Loop through the file; read and echo col 3 -- change $3 to which ever column you need
awk '{ print $3 }' <nlist.txt | while read dbuser
do
        echo "copying plugin..."
        #echo "($dbuser)"               # debugging if needed
        deststr="foo/home/admin/$dbuser.mydomain.com/wp-content/plugins/wp-stuff"

        cp -R -p /home/wp-stuff $deststr
done

If your input list contains only the dbuser name, then I suggest running your script with a 'set -x' at the top and looking at the tracing output for clues as to what is going on.

Hope this is useful.
# 3  
Old 08-03-2010
Thanks for the response.

No, there is only one column of manually entered names. It is a simple text file and although it was about 250 lines long with legitimate subdomain names, I have manually reduced it to two for testing.

If I actually copy the screen output of the command that is echoed and repaste it as a single line, it works as well.

For example, it will display on the screen:
Code:
...
cp -R -p /home/wp-stuff /home/admin/aname.mydomain.com/wp-content/plugins/wp-stuff: No such file or directory

If I manually copy everything before the colon and paste it to a new line it works fine.

Here is an actual screen copy of me doing that, I have just changed the names for security.

Code:
-bash-3.2# ./clong.sh
copying plugin...
./clong.sh: line 23: cp -R -p /home/wp-stuff /home/admin/name1.mydomain.com/wp-content/plugins/wp-stuff: No such file or directory
done
copying plugin...
./clong.sh: line 23: cp -R -p /home/wp-stuff /home/admin/name2.mydomain.com/wp-content/plugins/wp-stuff: No such file or directory
done
-bash-3.2# cp -R -p /home/wp-stuff /home/admin/name2.mydomain.com/wp-content/plugins/wp-stuff
-bash-3.2#

As you can see, I copied the last line before the : (ctrl C) and repasted (mouse right click) it into the same ssh window and it worked without a hitch. (Yes the file copy worked, I checked.)

Other than me changing the subdomain and domain name here in this post, this is a ctrl C of the ssh screen and a ctrl V to here.

I really am baffled by this. The only things that I can come up with are;

1. My bash is broken.
2. The cat function is pulling in an invisible character that is screwing it up.

---------- Post updated at 02:27 PM ---------- Previous update was at 02:05 PM ----------

Here is the -x printout from the script.
Code:
-bash-3.2# ./clong.sh
+ IFS='
'
+ IFS='
'
++ cat nlist.txt
+ for line in '`cat nlist.txt`'
+ dbuser=name1
+ echo 'copying plugin...'
copying plugin...
+ deststr=/home/admin/name1.mydomain.com/wp-content/plugins/wp-stuff
+ movestr='cp -R -p /home/wp-stuff /home/admin/name1.mydomain.com/wp-content/plugins/wp-stuff'
+ 'cp -R -p /home/wp-stuff /home/admin/name1.mydomain.com/wp-content/plugins/wp-stuff'
./clong.sh: line 23: cp -R -p /home/wp-stuff /home/admin/name1.mydomain.com/wp-content/plugins/wp-stuff: No such file or directory
+ echo done
done
+ for line in '`cat nlist.txt`'
+ dbuser=name2
+ echo 'copying plugin...'
copying plugin...
+ deststr=/home/admin/name2.mydomain.com/wp-content/plugins/wp-stuff
+ movestr='cp -R -p /home/wp-stuff /home/admin/name2.mydomain.com/wp-content/plugins/wp-stuff'
+ 'cp -R -p /home/wp-stuff /home/admin/name2.mydomain.com/wp-content/plugins/wp-stuff'
./clong.sh: line 23: cp -R -p /home/wp-stuff /home/admin/name2.mydomain.com/wp-content/plugins/wp-stuff: No such file or directory
+ echo done
done
-bash-3.2#

# 4  
Old 08-03-2010
You have set IFS to only split on a newline. After $movestr is expanded, there will not be any field splitting on the spaces within the string; it's just one long word to the shell.

Regards,
Alister
# 5  
Old 08-03-2010
Quote:
Originally Posted by alister
You have set IFS to only split on a newline. After $movestr is expanded, there will not be any field splitting on the spaces within the string; it's just one long word to the shell.

Regards,
Alister
If I understand you correctly, you are saying that if the first line contains "word1 word2" etc that it is what is causing the problem.

My text file has ONE word per line.

My entire test file (nlist.txt) has two words in total, one on each line.

Also, if I copied and pasted what has failed if this were the case, why would it work?

If you feel that it is the case, how would I rectify this?
# 6  
Old 08-03-2010
You do not understand me correctly.

The value of the IFS variable determines which characters are used to split the result of variable expansion. $movestr expands to the string "cp -R -p ...." and you have modified IFS so that it only splits that string on newlines. For that command to work properly, you need the shell to split on spaces as well .. perhaps tabs. In short, using the default value of IFS. Alternatively, you could use eval. The best solution, in this case, however, is to not use a for loop; use a while read loop and don't mess with IFS (at least not until you've had a chance to study its effects further).

You can confirm that this is the problem by storing the old value of IFS and restoring it before the line: $movestr

Demonstration:
Code:
$ cmd='echo hello world'
$ $cmd
hello world
$ IFS='
> '
$ $cmd
-bash: echo hello world: command not found

# 7  
Old 08-03-2010
Thanks.

I had tried a while loop in the last 15 hours of frustration, but I must have done something else wrong because at the time it made no difference.

However, I tried it again as per your suggestion and it works.

The only caveat was that I had to put a new line at the end of the text list or it would fail to do the last one.

New and WORKING code Smilie:

Code:
#!/bin/bash

clear


 while read line
 do

dbuser=$line

echo "copying plugin..."


deststr="/home/admin/"$dbuser".mydomain.com/wp-content/plugins/wp-stuff"

movestr="cp -R -p /home/wp-stuff "$deststr
$movestr

echo "done"

done <"nlist.txt"

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Read in script doesn't work

I am trying to run a script to make a simple modification to a number of similar files. The sed works, but after it runs and the differences are displayed, the script does not read ans to start a renaming script if the user answered Y or y.for i in "$@" do sed -f myfile.sed $i >$i.new diff... (2 Replies)
Discussion started by: wbport
2 Replies

2. Shell Programming and Scripting

[Solved] Script doesn't work..help?

hi, i am trying to run this script.the name of script is final.sh after i run it: #./final.sh & i grep the command # ps -a | grep bash and i see more then one processes runing 3!! Please use code tags how can i solve this problem? my target script must always run in... (8 Replies)
Discussion started by: zigizag
8 Replies

3. Shell Programming and Scripting

my script doesn't work :(

i have this script and when i ejecute it, the console tell me this " sintax error line 41 unexpected element "}" " is the sintaxis ok? #!/bin/bash if ;then { exit 0; } if ; then { sudo /etc/init.d/apache2 start; sudo /etc/init.d/mysql start; php5 & nautilus... (3 Replies)
Discussion started by: keiserx
3 Replies

4. Shell Programming and Scripting

tail -XXX with grep doesn't work in while loop

Hi all, I need some help. my shell script doesn't work especially in the loop. #!/bin/sh -xv export ORA_ADMIN=/oracle/home/admin export ORACLE_SID=ORA_SID cat ${ORA_ADMIN}/param_alert_log.ora | while read MSG do #echo $MSG #echo "tail -400... (8 Replies)
Discussion started by: sidobre
8 Replies

5. Shell Programming and Scripting

Help with script.. it Just doesn't work

Hello,, Im verry new to scripting and have some problems with this script i made.. What it does: It checks a directory for a new directory and then issues a couple of commands. checks sfv - not doing right now checks rar - it checks if theres a rar file and when there is it skips to... (1 Reply)
Discussion started by: atmosroll
1 Replies

6. Shell Programming and Scripting

for loop doesn't work

I have a script which uses below for loop: for (( i = 0 ; i <= 5; i++ )) do echo "Welcome $i times" done But when I run the script, it gives error message: Syntex Error : Bad for loop variable Can anyone guide to run it? Thanks in advance. (10 Replies)
Discussion started by: naw_deepak
10 Replies

7. Shell Programming and Scripting

gcd.sh script doesn't work...

Hi there. I'm new to scripting in bash shell and I have this problem. I'm trying to make a script that returns the greatest common divisor of two integer numbers according to Euclid's algorithm... Here is, what I've done: #!/bin/bash m=$1 n=$2 while do if ; #line 8 then m=$m-$n... (1 Reply)
Discussion started by: kantze
1 Replies

8. Shell Programming and Scripting

script doesn't work in another distribution

Hi everybody: I usually use Mandriva distro (in my laptop), and I have made some scripts. These scripts work correctly but now, in other computer which is installed Ubuntu don't work, and I have this error message: The script is: ..... echo "Your option is:" echo read option case... (1 Reply)
Discussion started by: tonet
1 Replies

9. UNIX for Dummies Questions & Answers

Script doesn't work, but commands inside work

Howdie everyone... I have a shell script RemoveFiles.sh Inside this file, it only has two commands as below: rm -f ../../reportToday/temp/* rm -f ../../report/* My problem is that when i execute this script, nothing happened. Files remained unremoved. I don't see any error message as it... (2 Replies)
Discussion started by: cheongww
2 Replies

10. UNIX for Dummies Questions & Answers

Why script For...Loop doesn't work. Seek help

I have written a script to run on UNIX server. When I tested, it always hanged on after "date +"%D %T: XXXXXX script started." part. Then it wouldn't go further. UNIX server gave me one error message. I used the same code in another script. It works fine. I think the major problem may be in... (3 Replies)
Discussion started by: duke0001
3 Replies
Login or Register to Ask a Question