Shell scripting and ls -1 problem


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Shell scripting and ls -1 problem
# 1  
Old 09-03-2009
Shell scripting and ls -1 problem

Hey, I'm running knoppix and I'm trying to run a shell script to change multiple lines of text in multiple files

Code:
#!/bin/sh
for i in 'ls-1 test'
do
sed 's/bob/manny/'g $i > $i.0
mv $i.0 $i
done

Obviously this isn't the original file, but it's on another non-networked machine.

What happens is that the console returns

sed: invalid option -- 1 , gives me options for sed then mv complains about the -1

I tried removing the -1 from ls, instead sed complained about ls.

This seems like it should work, what did I do wrong?

Last edited by DukeNuke2; 09-03-2009 at 07:10 PM..
# 2  
Old 09-03-2009
To keep the forums high quality for all users, please take the time to format your posts correctly.

First of all, use Code Tags when you post any code or data samples so others can easily read your code. You can easily do this by highlighting your code and then clicking on the # in the editing menu. (You can also type code tags [code] and [/code] by hand.)

Second, avoid adding color or different fonts and font size to your posts. Selective use of color to highlight a single word or phrase can be useful at times, but using color, in general, makes the forums harder to read, especially bright colors like red.

Third, be careful when you cut-and-paste, edit any odd characters and make sure all links are working property.

Thank You.

The UNIX and Linux Forums

---------- Post updated at 00:12 ---------- Previous update was at 00:10 ----------

i've not checked your script... but it sould be ` (backtick) instead of '.

Code:
`ls -1 test`

and the -1 is not needed either...
# 3  
Old 09-03-2009
Quote:
#!/bin/sh
for i in 'ls-1 test'
do
sed 's/bob/manny/'g $i > $i.0
mv $i.0 $i
done
There are a variety of little bugs in this script.

1) The single quotes around 'ls-1 test' cause that whole string to be in variable $i which is what upset sed. To execute a command they need to be in backticks. Subtle but very important.
2) The second single quote in the sed line is misplaced. I think "sed" needs a "-e" switch but I don't know your O/S.
3) Though it hasn't caused an issue here you will be well advised to not call a script "test" because it is the name of a unix command.
4) There are better, more robust and POSIX-compliant methods to achieve this result.
5) "ls-1" should be "ls -1". The space character after "ls" is mandatory.

Code:
#!/bin/sh
for i in `ls -1 test`
do
      sed -e 's/bob/manny/g' $i > $i.0
      mv $i.0 $i
done


Last edited by methyl; 09-03-2009 at 09:34 PM.. Reason: grammar and correct ls -1 again
# 4  
Old 09-03-2009
Quote:
Originally Posted by afroCluster
Hey, I'm running knoppix and I'm trying to run a shell script to change multiple lines of text in multiple files

Code:
#!/bin/sh
for i in 'ls-1 test'


Even after correcting that to

Code:
for i in `ls -1 test`  ## backticks, not apostrophes

it is still the wrong way to loop through files. Not only is ls unnecessary, but it will cause the script to fail if any filenames contain spaces. (Also, the -1 is unnecessary since the output is not going to a terminal.)

The correct way is:

Code:
for i in test/*

# 5  
Old 09-03-2009
A more robust approach which preserves space characters in filenames and works for any number of files is:

Code:
#!/bin/sh
ls -1 mytest.sh | while read filename
do
      sed -e 's/bob/manny/g' "${filename}" > "${filename}.0"
      mv "${filename}.0" "${filename}"
done


While doing this I belatedly noticed that
Code:
ls-1

should be
Code:
ls -1

(the space character after ls is mandatory).
Looking back, "cfajohnson" spotted this immediately.

Last edited by methyl; 09-03-2009 at 09:38 PM.. Reason: Don't use test as the name of script! More grammar. remove some " to avoid confusion with syntax.
# 6  
Old 09-03-2009
Quote:
Originally Posted by methyl
A more robust approach which preserves space characters in filenames and works for any number of files is:

That is less robust than my suggestion. It will fail if there is a newline (heaven forbid!) in a file name. It also uses an unnecessary external command.

It will also fail if there is leading or trailing whitespace in any filenames. Or if there are any backslashes.

The syntax I used will work no matter what pathological characters are in the filenames.
Quote:
Code:
#!/bin/sh
ls -1 mytest.sh | while read filename


The -1 is not needed because the output of ls is not going to a terminal.

I think you meant:

Code:
ls test | while IFS= read -r filename

Quote:
do
sed -e 's/bob/manny/g' "${filename}" > "${filename}.0"
mv "${filename}.0" "${filename}"

You should check that sed succeeded before wiping the original file:

Code:
   sed -e 's/bob/manny/g' "${filename}" > "${filename}.0" &&
   mv "${filename}.0" "${filename}"[/QUOTE]

# 7  
Old 09-03-2009
Many good points.
Good point about checking result from "sed".
Leading or trailing whitespace and backslashes in filenames will indeed fox most scripts and some commercial backup software. Imho any such filenames should be detected and removed from the system forthwith.

I disagree with "for i in test/*" because it fails on AIX for example with long lists.

Ps. I do run a periodic detect and manual clean of weird filenames in user directories. Unix files such as "C:\user_had_brain_damage.txt" upset our backup software.

While I remember, I have read much good advice about not interfering with IFS which dates back to the roots of unix.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Shell scripting problem

Hello. I hava homework for university but i cant do it and i need a little help if someone can help me :) I have to do a linux shell script. Write a script that does the following: 1. Check if there is a directory in / home with myDir name. If not, it creates it. 2. In the directory it... (1 Reply)
Discussion started by: alex4o0o
1 Replies

2. Emergency UNIX and Linux Support

Need support for a shell scripting problem

Hello all, I am facing a weird issue while executing a code below - #!/bin/bash cd /wload/baot/home/baotasa0/sandboxes_finance/ext_ukba_bde/pset sh UKBA_publish.sh UKBA 28082015 3 if then echo "Param file conversion for all the areas are completed, please check in your home directory"... (2 Replies)
Discussion started by: ektubbe
2 Replies

3. Shell Programming and Scripting

Shell Scripting awk Problem

I'm limited in my skills related to *nix and I'm even more limited in my skills related to shell scripting and the use of awk. I have what should be a relatively simple shell script that looks in the /etc/fstab to see if a particular partition exists on the Linux system. The intention of this part... (2 Replies)
Discussion started by: DisabledVet
2 Replies

4. Shell Programming and Scripting

Shell scripting newbie problem

I am trying to create a shell script similar to ls, but which only lists directories. I have the first half working (no argument version), but trying to make it accept an argument, I am failing. My logic is sound I think, but I'm missing something on the syntax, I'm guessing in the bolded line? ... (9 Replies)
Discussion started by: Tibor63
9 Replies

5. Homework & Coursework Questions

Shell Scripting Problem...

Use and complete the template provided. The entire template must be completed. If you don't, your post may be deleted! Hello all,,, I am trying to finish my assignment for my CNET class. I am running into 2 problems... First the "Delete a file" (Option 1) When I run this option everything... (5 Replies)
Discussion started by: ozman911
5 Replies

6. Shell Programming and Scripting

Problem in loops in shell scripting

Hi, #!/bin/ksh $v="" for ((i = 1 ; i <= 5 ; i++ )) do v="THerrFile_$i.err"; grep -i "$i:Error" $v >>oraerror_output.txt done My requirement is to dynamically create variable like THerrFile_1.err,THerrFile_2.err etc. where my grep needs... (5 Replies)
Discussion started by: sudhir_83k
5 Replies

7. Shell Programming and Scripting

Shell Scripting problem

Hi guys, I am a newbie to shell scripting.Please help me to accomplish this task. Its very urgent,I should create a script which will do the following: i) "cd ~joseph/ ; mkdir -p Bing/Bong ;mkdir -p Bing/Bang" and then create 15 ".txt" files with content "Bing Bang Bong" in "Bong"... (1 Reply)
Discussion started by: mahesh_raghu
1 Replies

8. Shell Programming and Scripting

Problem - gnome terminal shell scripting

I've a python script named rwe.py. I'm running the program in three separate terminals. If one of the executing program stops . I want to leave the terminal as it is so that i can see the error. i wrote a the below script and used cron to run it every one hour to check if the three programs are... (0 Replies)
Discussion started by: msteve2002
0 Replies

9. Shell Programming and Scripting

shell scripting problem

her i am trying to edit a database file which is actually a small file holding my friend's name and birthdays My Database DEEPAK 27/08 DEEPIKA 18/02 DHYAN 23/03 DIPANKAR 24/10 SNIGDHO 19/05 AYANNAR 17/12 BHAI 22/09 DEBAN 16/08 JAGADISH 02/06 SUBHOJIT 23/02 TOJO 17/09 SUDHIR 12/09... (1 Reply)
Discussion started by: mobydick
1 Replies

10. Solaris

Problem in for loop of shell scripting in solaris

Hi below is my script for((i=0;i<=$TOTAL;i++)) do echo "IP's created are $s1.$s2.$s3.$s4" s4=`expr $s4 + 1` done where s1,2,3,4 are input varibles below error occurs while running the script syntax error at lin 11: '(' unexpected ... (12 Replies)
Discussion started by: krevathi1912
12 Replies
Login or Register to Ask a Question