views:

29

answers:

1

I am trying to substitute output from variable to give another output. The variable i have problems with is the $apps. It gives me "syntax error: bad substitution".

$appletDir is a directory with desktop shortcuts. The problem is that some shortcuts do not have the same name as the icon(png). So i need to substitute the program name with the png linking to it. I got it working with the commented out if-statement below. If this substitution could work then my script would look better. Cause i need to put down a couple of this.

I want it to look for "general_call" instead of "rtcom-call-ui" when going through the icon folders. Cause the png is called "general_call". The icons folders are the variables $icoDir64 $icoDirSca.

for applet in $appletDir*
do

app=`basename $applet | sed -e 's/.*://g' -e 's/.*osso-//g' -e 's/\.desktop.*//g'`
apps="${app/rtcom-call-ui/general_call}"
    #if [ "${app}" = "rtcom-call-ui" ]; then
    #   app="general_call"
    #fi
#echo $apps
#done
#exit 0

found=`find ${icoDir64} ${icoDirSca} -name "*.png"`

for file in $found
do
    base="`basename ${file}`"

    if [ "${base}" = "${app}.png" -o "${base}" = "tasklaunch_${app}.png" -o "${base}" = "general_${app}.png" ]; then
        echo "WORKING!!!!!!!!!!!!!!!!!! $file" 
    fi
done
done
+1  A: 

I think you may have a shell version problem (your shell isn't as modern as the notation you are using). A previous incarnation of this post suggested:

apps="${app}/rtcom-call-ui/general_call"

Or, for substituting rtcom-call-ui with general_call, you need to use echo and sed (at least in classic shells - it might be that bash has something built-in to do it):

apps=$(echo "${app}" | sed s/rtcom-call-ui/general_call/)

The notation ${var|continuation} (where | represents an arbitrary punctuation character) is used to modify the value substituted. For example:

apps="${app:-/something/suitable/as/the/default}"

would copy the value of $app, unless $app is not set at all (not relevant here; useful with environment variables) or if $app is an empty string.

The error you are getting is because there is no valid substitution that starts with '/' in your version of the shell. This notation seems to be valid in some versions of Bash (including the one I have to play with); I don't know when it was added. But if the shell you are using is complaining about the notation, then clearly it is not correct for the version of the shell you are using.

Depending on the shebang line (#!/bin/sh vs #!/bin/bash), it might work differently. Failing that, the version of Bash on your machine may be too old.

You can check your shell(s) with:

for app in /some/location/rtcom-call-ui/where.png /another/location/nowhere/thing.png
do
    apps=${app/rtcom-call-ui/general-call}
    echo $app
    echo $apps
done
Jonathan Leffler
Thanks! That got rid of the "syntax error" but did not do as i intended it to do. It added "/rtcom-call-ui/general_call" behind all outputs.. so it look like "xterm/rtcom-call-ui/general_call". It did not do any substitution..
AlMehdi
Thanks! I was hoping my original thought would work.. but it could be as you said. A version thing.. i saw it in a guide and thought i could try it out. I will go with the sed way you pointed out.. it will be almost as good. ;)
AlMehdi