Bash too many arguments error

Hello, I've got this little script that gets a bunch of comics and puts them in an html file. However, when I check that the comic URL is there and that it's a new one, I get the "too many arguments" error. The script is this:

CADURL=`curl --silent http://www.cad-comic.com/cad/ | grep -o 'http://cdn.cad-comic.com/comics/.*.jpg'`
COMICJKURL=`curl --silent http://comicjk.com/comic.php/latest | grep -o '../Pics/.*\.gif' | sed 's|\.\.|http://comicjk.com|g'`
BUGURL=`curl --silent http://www.bugcomic.com/ | grep -o 'http://www.bugcomic.com/comics/.*.png'`
XKCDURL=`curl --silent http://www.xkcd.com/ | grep -o 'http://imgs.xkcd.com/comics/.*.png' | head -1`
DILBERTURL=`curl --silent http://www.dilbert.com/ | grep -o 'http://dilbert.com/dyn/str_strip/.*/.*/.*/.*/.*/.*/.*/.*/.*\.strip\..*\gif'`
CYANIDEURL=`curl --silent -L http://www.explosm.net/comics/new/ | grep -o 'http://www.explosm.net/db/files/Comics/.*/.*.png'`
HIJINKSURL=`curl --silent http://hijinksensue.com/ | grep -o 'http://hijinksensue.com/comics/.*.jpg'`

HEADER="<html>\n<head>\n\t<title>Home</title>\n</head>"
CADHTML='<FONT FACE="Lucida Grande" SIZE=20><br>CTRL-ALT-DEL<br></FONT>\n<img style="padding: 5px\; border: 1px solid \#000000\;" src="CADURL">'
COMICJKHTML='<FONT FACE="Lucida Grande" SIZE=20><br>ComicJK<br></FONT>\n<img style="padding: 5px\; border: 1px solid \#000000\;" src="COMICJKURL">'
BUGHTML='<FONT FACE="Lucida Grande" SIZE=20><br>Bug<br></FONT>\n<img style="padding: 5px\; border: 1px solid \#000000\;" src="BUGURL">'
HIJINKSHTML='<FONT FACE="Lucida Grande" SIZE=20>HijiNKS ENSUE<br></FONT>\n<img style="padding: 5px\; border: 1px solid \#000000\;" src="HIJINKSURL">'
DILBERTHTML='<FONT FACE="Lucida Grande" SIZE=20><br>Dilbert<br></FONT>\n<img style="padding: 5px\; border: 1px solid \#000000\;" src="DILBERTURL">'
CYANIDEHTML='<FONT FACE="Lucida Grande" SIZE=20><br>Cyanide & Happiness<br></FONT>\n<img style="padding: 5px\; border: 1px solid \#000000\;" src="CYANIDEURL">'
XKCDHTML='<FONT FACE="Lucida Grande" SIZE=20><br>xkcd<br></FONT>\n<img style="padding: 5px\; border: 1px solid \#000000\;" src="XKCDURL">'

echo -e "$HEADER" > dailycomic.html
if [ $XKCDURL != "" ] $$ [ "$XKCDURL" != `cat .previouscm.txt | grep $XKCDURL` ]; then
	echo -e "$XKCDHTML" | sed "s|XKCDURL|$XKCDURL|" >> dailycomic.html
fi
if [ $CYANIDEURL != "" ] $$ [ $CYANIDEURL != `cat .previouscm.txt | grep $CYANIDEURL` ]; then
	echo -e "$CYANIDEHTML" | sed "s|CYANIDEURL|$CYANIDEURL|" >> dailycomic.html
fi
if [ $BUGURL != "" ] $$ [ $BUGURL != `cat .previouscm.txt | grep $BUGURL` ]; then
	echo -e "$BUGHTML" | sed "s|BUGURL|$BUGURL|" >> dailycomic.html
fi
if [ $COMICJKURL != "" ] $$ [ $COMICJKURL != `cat .previouscm.txt | grep $COMICJKURL` ]; then
	echo -e "$COMICJKHTML" | sed "s|COMICJKURL|$COMICJKURL|" >> dailycomic.html
fi
if [ $DILBERTURL != "" ] $$ [ $DILBERTURL != `cat .previouscm.txt | grep $DILBERTURL` ]; then
	echo -e "$DILBERTHTML" | sed "s|DILBERTURL|$DILBERTURL|" >> dailycomic.html
fi
if [ $HIJINKSURL != "" ] $$ [ $HIJINKSURL != `cat .previouscm.txt | grep $HIJINKSURL` ]; then
	echo -e "$HIJINKSHTML" | sed "s|HIJINKSURL|$HIJINKSURL|" >> dailycomic.html
fi
if [ $CADURL != "" ] $$ [ $CADURL != `cat .previouscm.txt | grep $CADURL` ]; then
	echo -e "$CADHTML" | sed "s|CADURL|$CADURL|" >> dailycomic.html
fi

I have googled for the fix for that error but I was unable to find anything that helped.

What is in .previouscm.txt ? Does it exist what is the result of such a grep?

[ "$XKCDURL" != "`cat .previouscm.txt | grep $XKCDURL`" ]

In any case I would use double quotes to make sure the test has a single argument.

The problem is you're using too many arguments. There are limits on argument lists and variable lengths, and if anything bash is unusually generous. You should keep both below a couple kilobytes in size.

This means statements that slurp in and/or compare entire massive blocks of data, like:

DILBERTURL=`entirety of everything`
$DILBERTURL != `cat .previouscm.txt | grep $DILBERTURL`

...should be avoided. Save the results directly into files with redirection, then use the diff command to see if there's any changes instead.

Scrutinizer, Well until this works, .previouscm.txt is just a text file with random letters and numbers. Once this script works, I will add a few lines at the bottom writing all of the current url's to the text file, so if the URL appears in the text file it will do nothing.
When I grep it, nothing is returned, as shown in bash debug:

'[' http://imgs.xkcd.com/comics/audiophiles.png '!=' '' ']' 98109 '[' http://imgs.xkcd.com/comics/audiophiles.png '!=' '' ']'

I also tried the double quotes, didn't help.

Corona688, The Dilbert URL is 113 character, http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/100000/00000/9000/300/109351/109351.strip.sunday.gif, and that is too large?
If so, I should change the code to output each url to separate files and have the old urls in separate files and diff them?

Oh. No, it's not. All the backticking and cat-ing and grep-ing had me thinking you were dealing with an entire list of comics.

Ah, ok. Damn, the error is still unexplained.

You have $$ in the if statements -- did you want && or || .

What are all those "$$" for? Did you mean that to be && or ||

It produces the comic list when I replace them with &&.

Well look at that. How stupid of me. That did it, thanks.

It LOOKS normal at first glance. :slight_smile: I didn't notice it until a few rereads.

Me neither :slight_smile: