Sh Script whats wrong?

Hi there,

i have a problem i have created followning sh files some years ago but now it dosen`t work anymore i never used it a long time. Can anyone find the Error? Its always runs the stop() block and trying to Killing the Server also if i try to start or creat a new one.

#!/bin/sh

stop()
{
	echo "Killing old shoutcast servers in $1"
	for oldpid in `ps -A | grep "$1" | grep "sc_serv" | cut -c 0-6`
	do
		kill -9 $oldpid
	done
	rm -f $HOME/$1/shoutcast.pid
}


start()
{
	servcount=0
	for cfile in `ls $HOME/$1`
	do
		echo -n $cfile
		echo -n " -> "
		#grep ^RelayServer /etc/shoutcast/$cfile
		grep ^RelayServer $HOME/$1/$cfile
		# This is the line where we actually run the shoutcast program!
		#sudo -u nobody /home/shoutcast/sc_serv /home/shoutcast/$cfile > /dev/null &
		$HOME/$1/sc_serv $HOME/$1/$cfile > /dev/null &
		servcount=`expr $servcount + 1`
	done
	#Create the pid file...
	ps -A | grep "$1" | grep "sc_serv" | cut -c 0-6 > $HOME/$1/shoutcast.pid
	#Done now!
	echo "Started $servcount servers in $1."
}


creat()
{
	if [[ -d "$1" ]]
	then
		echo "ERROR: STREAM $1 already exists !!"
	else
		mkdir -p $HOME/$1
		cp -f sc_serv $HOME/$1/.
		touch $HOME/$1/sc_serv.cfg
		echo "Creating the CONFIG file $HOME/$1/sc_serv.cfg..."
		echo "Enter MaxUser: "
		read listener
		echo "Enter Password: "
		read pass
		echo "Enter PortBase: "
		read port
		echo "Enter AdminPassword: "
		read apass

		echo "MaxUser=$listener" > $HOME/$1/sc_serv.cfg
		echo "Password=$pass" >> $HOME/$1/sc_serv.cfg
		echo "PortBase=$port" >> $HOME/$1/sc_serv.cfg
		echo "LogFile=sc_serv.log" >> $HOME/$1/sc_serv.cfg
		echo "RealTime=1" >> $HOME/$1/sc_serv.cfg
		echo "ScreenLog=1" >> $HOME/$1/sc_serv.cfg
		echo "ShowLastSongs=10" >> $HOME/$1/sc_serv.cfg
		echo "W3CEnable=Yes" >> $HOME/$1/sc_serv.cfg
		echo "W3CLog=sc_w3c.log" >> $HOME/$1/sc_serv.cfg
		echo "SrcIP=ANY" >> $HOME/$1/sc_serv.cfg
		echo "DestIP=ANY" >> $HOME/$1/sc_serv.cfg
		echo "Yport=80" >> $HOME/$1/sc_serv.cfg
		echo "NameLookups=0" >> $HOME/$1/sc_serv.cfg
		echo "AdminPassword=$apass" >> $HOME/$1/sc_serv.cfg
		echo "AutoDumpUsers=0" >> $HOME/$1/sc_serv.cfg
		echo "AutoDumpSourceTime=30" >> $HOME/$1/sc_serv.cfg
		echo "TitleFormat=%s" >> $HOME/$1/sc_serv.cfg
		echo "PublicServer=default" >> $HOME/$1/sc_serv.cfg
		echo "AllowRelay=Yes" >> $HOME/$1/sc_serv.cfg
		echo "AllowPublicRelay=Yes" >> $HOME/$1/sc_serv.cfg
		echo "MetaInterval=32768" >> $HOME/$1/sc_serv.cfg
	fi
}


case "$1" in
	start)
		if [[ ! -e $HOME/$2/shoutcast.pid ]]
		then
			start $2
			if [[ -e $HOME/$2/shoutcast.pid ]]
			then
				echo "Shoutcast $2 Startup...... [SUCCESS]"
			fi
		else
			echo "Shoutcast $2 Startup...... [FAILED]"
		fi
		;;
	restart)
		stop $2
		sleep 4
		start $2
		if [[ -e $HOME/$2/shoutcast.pid ]]
		then
			echo "Shoutcast $2 Startup...... [SUCCESS]"
		fi
		;;
	stop)
		if [[ -e $HOME/$2/shoutcast.pid ]]
		then
			stop $2
			echo "Shoutcast $2 shutdown...... [SUCCESS]"
		else
			echo "There are no registered shoutcast servers running right now in $2. Attempting to kill anyways."
			stop $2
		fi
		;;
	creat)
		creat $2
		if [[ -d "$2" ]]
		then
			echo "Shoutcast $2 folder created...... [SUCCESS]"
		else
			echo "Shoutcast $2 folder created...... [FAILED]"
		fi
		;;
	*)
		echo "Usage: sh ./shoutcast.sh (start|stop|restart|creat) (FOLDER_NAME)"
		;;
esac

Sorry for my bad english

I see missing:

case $1 in   # no double quotes here...
'start')

etc
(none for the last one (*))

ok i changed it to:

#!/bin/sh

stop()
{
	echo "Killing old shoutcast servers in $1"
	for oldpid in `ps -A | grep "$1" | grep "sc_serv" | cut -c 0-6`
	do
		kill -9 $oldpid
	done
	rm -f $HOME/$1/shoutcast.pid
}


start()
{
	servcount=0
	for cfile in `ls $HOME/$1`
	do
		echo -n $cfile
		echo -n " -> "
		#grep ^RelayServer /etc/shoutcast/$cfile
		grep ^RelayServer $HOME/$1/$cfile
		# This is the line where we actually run the shoutcast program!
		#sudo -u nobody /home/shoutcast/sc_serv /home/shoutcast/$cfile > /dev/null &
		$HOME/$1/sc_serv $HOME/$1/$cfile > /dev/null &
		servcount=`expr $servcount + 1`
	done
	#Create the pid file...
	ps -A | grep "$1" | grep "sc_serv" | cut -c 0-6 > $HOME/$1/shoutcast.pid
	#Done now!
	echo "Started $servcount servers in $1."
}


creat()
{
	if [[ -d "$1" ]]
	then
		echo "ERROR: STREAM $1 already exists !!"
	else
		mkdir -p $HOME/$1
		cp -f sc_serv $HOME/$1/.
		touch $HOME/$1/sc_serv.cfg
		echo "Creating the CONFIG file $HOME/$1/sc_serv.cfg..."
		echo "Enter MaxUser: "
		read listener
		echo "Enter Password: "
		read pass
		echo "Enter PortBase: "
		read port
		echo "Enter AdminPassword: "
		read apass

		echo "MaxUser=$listener" > $HOME/$1/sc_serv.cfg
		echo "Password=$pass" >> $HOME/$1/sc_serv.cfg
		echo "PortBase=$port" >> $HOME/$1/sc_serv.cfg
		echo "LogFile=sc_serv.log" >> $HOME/$1/sc_serv.cfg
		echo "RealTime=1" >> $HOME/$1/sc_serv.cfg
		echo "ScreenLog=1" >> $HOME/$1/sc_serv.cfg
		echo "ShowLastSongs=10" >> $HOME/$1/sc_serv.cfg
		echo "W3CEnable=Yes" >> $HOME/$1/sc_serv.cfg
		echo "W3CLog=sc_w3c.log" >> $HOME/$1/sc_serv.cfg
		echo "SrcIP=ANY" >> $HOME/$1/sc_serv.cfg
		echo "DestIP=ANY" >> $HOME/$1/sc_serv.cfg
		echo "Yport=80" >> $HOME/$1/sc_serv.cfg
		echo "NameLookups=0" >> $HOME/$1/sc_serv.cfg
		echo "AdminPassword=$apass" >> $HOME/$1/sc_serv.cfg
		echo "AutoDumpUsers=0" >> $HOME/$1/sc_serv.cfg
		echo "AutoDumpSourceTime=30" >> $HOME/$1/sc_serv.cfg
		echo "TitleFormat=%s" >> $HOME/$1/sc_serv.cfg
		echo "PublicServer=default" >> $HOME/$1/sc_serv.cfg
		echo "AllowRelay=Yes" >> $HOME/$1/sc_serv.cfg
		echo "AllowPublicRelay=Yes" >> $HOME/$1/sc_serv.cfg
		echo "MetaInterval=32768" >> $HOME/$1/sc_serv.cfg
	fi
}


case $1 in
	'start')
		if [[ ! -e $HOME/$2/shoutcast.pid ]]
		then
			start $2
			if [[ -e $HOME/$2/shoutcast.pid ]]
			then
				echo "Shoutcast $2 Startup...... [SUCCESS]"
			fi
		else
			echo "Shoutcast $2 Startup...... [FAILED]"
		fi
		;;
	'restart')
		stop $2
		sleep 4
		start $2
		if [[ -e $HOME/$2/shoutcast.pid ]]
		then
			echo "Shoutcast $2 Startup...... [SUCCESS]"
		fi
		;;
	'stop')
		if [[ -e $HOME/$2/shoutcast.pid ]]
		then
			stop $2
			echo "Shoutcast $2 shutdown...... [SUCCESS]"
		else
			echo "There are no registered shoutcast servers running right now in $2. Attempting to kill anyways."
			stop $2
		fi
		;;
	'creat')
		creat $2
		if [[ -d "$2" ]]
		then
			echo "Shoutcast $2 folder created...... [SUCCESS]"
		else
			echo "Shoutcast $2 folder created...... [FAILED]"
		fi
		;;
	*)
		echo "Usage: sh ./shoutcast.sh (start|stop|restart|creat) (FOLDER_NAME)"
		;;
esac

But it still just running the:

stop()
{
	echo "Killing old shoutcast servers in $1"
	for oldpid in `ps -A | grep "$1" | grep "sc_serv" | cut -c 0-6`
	do
		kill -9 $oldpid
	done
	rm -f $HOME/$1/shoutcast.pid
}

What is your OS and version?

---

Hi vbe, I agree the double quotes around $1 serve no purpose here, but they are allowed.
The single quotes around start are not necessary...

I use Debian 7.2

In sh you should use single squared brackets, not double ones those are not POSIX shell syntax (some shells may allow them but they are not part of the syntax). Debian uses a strict POSIX shell (dash) as /bin/sh

So if [ ! -e $HOME/$2/shoutcast.pid ] instead of if [[ ! -e $HOME/$2/shoutcast.pid ]]

It should give you a syntax error, but I doubt if it would cause the behavior you are describing.

Yes scrutinizer I am fussy on the orthodoxy side ... thats because in older times HP-UX was very strict in ksh , what could run on aix 4.3 may not on hpux10... and so I had the habit to be very strict myself and test first on hpux hehe...
Now about our friend who corrected for me ( was and still am very busy ) I took the time to test the script:
modified a bit the script and got:

n12:/sm/cron/bin/wks/test $ whats_wrong stop
this is line 3
whats_wrong[4]: 0403-057 Syntax error at line 4 : `(' is not expected.

So I looked again at the script and corrected it:

#!/bin/sh

echo this is line 3
fstop() 
{
        echo "Killing old shoutcast servers in $1"
        #       for oldpid in `ps -A | grep "$1" | grep "sc_serv" | cut -c 0-6`
        #       do
        #               kill -9 $oldpid
        #       done
        #       rm -f $HOME/$1/shoutcast.pid
        read kyb
}


fstart()
{
        servcount=0
        for cfile in `ls $HOME/$1`
        do
                echo -n $cfile
                echo -n " -> "
                #grep ^RelayServer /etc/shoutcast/$cfile
                grep ^RelayServer $HOME/$1/$cfile
                # This is the line where we actually run the shoutcast program!
                #sudo -u nobody /home/shoutcast/sc_serv /home/shoutcast/$cfile > /dev/null &
                $HOME/$1/sc_serv $HOME/$1/$cfile > /dev/null &
                servcount=`expr $servcount + 1`
        done
        #Create the pid file...
        ps -A | grep "$1" | grep "sc_serv" | cut -c 0-6 > $HOME/$1/shoutcast.pid
        #Done now!
        echo "Started $servcount servers in $1."
}


fcreat()
{
        if [[ -d "$1" ]]
        then
                echo "ERROR: STREAM $1 already exists !!"
        else
                mkdir -p $HOME/$1
                cp -f sc_serv $HOME/$1/.
                touch $HOME/$1/sc_serv.cfg
                echo "Creating the CONFIG file $HOME/$1/sc_serv.cfg..."
                echo "Enter MaxUser: "
                read listener
                echo "Enter Password: "
                read pass
                echo "Enter PortBase: "
                read port
                echo "Enter AdminPassword: "
                read apass

                echo "MaxUser=$listener" > $HOME/$1/sc_serv.cfg
                echo "Password=$pass" >> $HOME/$1/sc_serv.cfg
                echo "PortBase=$port" >> $HOME/$1/sc_serv.cfg
                echo "LogFile=sc_serv.log" >> $HOME/$1/sc_serv.cfg
                echo "RealTime=1" >> $HOME/$1/sc_serv.cfg
                echo "ScreenLog=1" >> $HOME/$1/sc_serv.cfg
                echo "ShowLastSongs=10" >> $HOME/$1/sc_serv.cfg
                echo "W3CEnable=Yes" >> $HOME/$1/sc_serv.cfg
                echo "W3CLog=sc_w3c.log" >> $HOME/$1/sc_serv.cfg
                echo "SrcIP=ANY" >> $HOME/$1/sc_serv.cfg
                echo "DestIP=ANY" >> $HOME/$1/sc_serv.cfg
                echo "Yport=80" >> $HOME/$1/sc_serv.cfg
                echo "NameLookups=0" >> $HOME/$1/sc_serv.cfg
                echo "AdminPassword=$apass" >> $HOME/$1/sc_serv.cfg
                echo "AutoDumpUsers=0" >> $HOME/$1/sc_serv.cfg
                echo "AutoDumpSourceTime=30" >> $HOME/$1/sc_serv.cfg
                echo "TitleFormat=%s" >> $HOME/$1/sc_serv.cfg
                echo "PublicServer=default" >> $HOME/$1/sc_serv.cfg
                echo "AllowRelay=Yes" >> $HOME/$1/sc_serv.cfg
                echo "AllowPublicRelay=Yes" >> $HOME/$1/sc_serv.cfg
                echo "MetaInterval=32768" >> $HOME/$1/sc_serv.cfg
        fi
}


case $1 in
        'start')
                if [[ ! -e $HOME/$2/shoutcast.pid ]]
                then
                        fstart $2
                        if [[ -e $HOME/$2/shoutcast.pid ]]
                        then
                                echo "Shoutcast $2 Startup...... [SUCCESS]"
                        fi
                else
                        echo "Shoutcast $2 Startup...... [FAILED]"
                fi
                ;;
        'restart')
                fstop $2
                sleep 4
                fstart $2
                if [[ -e $HOME/$2/shoutcast.pid ]]
                then
                        echo "Shoutcast $2 Startup...... [SUCCESS]"
                fi
                ;;
        'stop')
                if [[ -e $HOME/$2/shoutcast.pid ]]
                then
                        fstop $2
                        echo "Shoutcast $2 shutdown...... [SUCCESS]"
                else
                        echo "There are no registered shoutcast servers running right now in $2. Attempt
ing to kill anyways."
                        fstop $2
                fi
                ;;
        'creat')
                fcreat $2
                if [[ -d "$2" ]]
                then
                        echo "Shoutcast $2 folder created...... [SUCCESS]"
                else
                        echo "Shoutcast $2 folder created...... [FAILED]"
                fi
                ;;
        *)
                echo "Usage: sh ./shoutcast.sh (start|stop|restart|creat) (FOLDER_NAME)"
                ;;
esac

I have no means of testing but should work now...
IMHO it is NEVER a good idea to give to functions the names of argument you expect...
This is what I get now:

n12:/sm/cron/bin/wks/test $ whats_wrong stop
this is line 3
There are no registered shoutcast servers running right now in . Attempting to kill anyways.
Killing old shoutcast servers in 

Dont forget to remove my comments in ftop function and the read kyb...