Hi all.
I am trying to write a "light" version of srm just as an exercise of shell scripting (started today with this ^^" I have to keep it really simple)
Basically it should just search for a file and, if found, ask for a confirmation before deleting it.
Now, it worked fine with /any/directory/you/like/no_spaces_in_the_name.file and I hoped to make it a little less dumb :P
Here's the code:

#!/bin/bash
#
#Script to safely remove files (asks confirmation)
#
choice="n"
if [ $# -eq 0 ]
then
echo "srm: missing argument."
echo "Syntax: $0 file_to_safely_delete."
exit 1
fi
filename=$1
if [ $# -gt 1 ]
then
filename="'$@'"
echo "$filename"
fi
if test -f $filename 
then
echo "$filename found. Are you sure you want to permanently delete it? (y/n)"
read choice
if [ $choice = "y" ] 
then
`rm $filename`
echo "$filename permanently deleted."
else
echo "$filename untouched."
fi
else
echo "$filename not found. Nothing done."
fi

The added part is

if [ $# -gt 1 ]
then
filename="'$@'"
echo "$filename"
fi

I put in it echo "$filename" for debugging and it shows correctly the string 'name of file with spaces' The error I receive is @ this line: if test -f $filename It prints out this: line 18: test: too many arguments After I call it with srm just a try I am just blind on why it doesn't work... any idea?
Anticipate thanks :)

p.s.
I have not yet find anything abount problems with spacing in shell scripting, but ¿strangely? if I indent the code like I'm used to with c/c++ it complains a lot so I'm not doing it at all. It's not urgent but I think I'm simply missing something obvious, so I'll be very grateful to anyone who'll give a sort of explanation ^^"

p.p.s.
as usual sorry for my english :$

Recommended Answers

All 5 Replies

I made these changes after your suggestion (red lines had quotes added around $filename)

#!/bin/bash
#
#Script to safely remove files (asks confirmation)
#
choice="n"
if [ $# -eq 0 ]
then
echo "srm: missing argument."
echo "Syntax: $0 file_to_safely_delete."
exit 1
fi
filename=$1
if [ $# -gt 1 ]
then
filename="'$@'"
echo "$filename"
fi
if test -f "$filename" 
then
echo "$filename found. Are you sure you want to permanently delete it? (y/n)"
read choice
if [ $choice = "y" ] 
then
`rm "$filename"`
echo "$filename permanently deleted."
else
echo "$filename untouched."
fi
else
echo "$filename not found. Nothing done."
fi

Now it doesn't complains, but it's malfunctioning: it enters the last else case even if "just a try" actually exists as a file :?

I can't imagine neither the cause nor the solution of this problem...

Actual situation:

ludovico@ludovico-laptop:~/Desktop$ srm just a try
'just a try'
'just a try' not found. Nothing done.

Ok, putting single quotes ' ' around the file name when calling the script made it work properly. I still don't understand why... I thought that

...
filename="'$@'"
...

would have done the job. Any explanation? Btw, thank you all, I'm just curious now ^^

Hey There,

Inside the double quotes, in your test statement, the single quotes are being treated as literal characters in the value of the filename variable:

If you just change

if test -f filename="'$@'"

to

if test -f filename="$@"

you should be all set

Hope that helps :)

, Mike

commented: Extra++ +19

It helped :)
Thank you both!

Awesome :)

Glad to help out :)

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.