这条语句单独执行,是没有问题的,可是放到shell里面,就会报错。怎么回事?

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
ljj_jjl2008
论坛版主
帖子: 14256
注册时间: 2007-09-16 8:29

这条语句单独执行,是没有问题的,可是放到shell里面,就会报错。怎么回事?

#1

帖子 ljj_jjl2008 » 2012-04-02 17:47

代码: 全选

#!/bin/bash

mode=1
home=""
if [ "$1" = "INIT" ]; then
  mode=2
  home=$2
else
  if [ "$1" = "START" ]; then
    echo "starting"
    mode=0
    home=$2
  else
    size=40 #unused in this program
    x=$1
    y=$2
    selectedgroup=$3
    raisemode=$4
    home="$5"
  fi
fi
if [ -z $home ]; then
  echo "fatal error: no /home/xxx found!"
  exit
fi
home="$home/.iconmenu2/bin"
cd $home

i=0
gc=0
s=""

while read buffer
do
  if [ -n "$buffer" ]; then
    if [ "${buffer:0:1}" != "#" ]; then
      if [ "${buffer:0:11}" = "baseconfig:" ]; then
        buffer0=${buffer#baseconfig:}
        xmain=`echo $buffer0|awk '{ print $1;}'`
        ymain=`echo $buffer0|awk '{ print $2;}'`
        sizemain=`echo $buffer0|awk '{ print $3;}'`
        gapmain=`echo $buffer0|awk '{ print $4;}'`
        sizesub=`echo $buffer0|awk '{ print $5;}'`
        gapsub=`echo $buffer0|awk '{ print $6;}'`
        raisemode=`echo $buffer0|awk '{ print $7;}'`
        autohidemainbutton=`echo $buffer0|awk '{ print $8;}'`
        autohideSubbutton=`echo $buffer0|awk '{ print $9;}'`
      fi
      if [ "${buffer:0:5}" = "group" ]; then
        group=`echo $buffer|awk '{ print $1;}'`
        result=${buffer#$group}
        group=${group#group}
        group=${group%#}
        if [ $mode -eq 2 ]; then
          echo "./iconrun1" $xmain $[ $ymain+$[ $gc * $[ $sizemain+$gapmain ] ] ] $sizemain $sizemain $raisemode $group $result $autohidemainbutton $autohideSubbutton
          `echo "./iconrun1" $xmain $[ $ymain+$[ $gc * $[ $sizemain+$gapmain ] ] ] $sizemain $sizemain $raisemode $group $result $autohidemainbutton $autohideSubbutton ` &
           exit
        fi
        if [ $mode -eq 0 ]; then
          if [ $group -gt 0 ]; then
            echo "./iconrun2 " $xmain $[ $ymain+$[ $[ $gc+1 ] * $[ $sizemain+$gapmain ] ] ] $sizemain $sizemain $raisemode $group $result
            `echo "./iconrun2 " $xmain $[ $ymain+$[ $[ $gc+1 ] * $[ $sizemain+$gapmain ] ] ] $sizemain $sizemain $raisemode $group $result ` &
            let "gc=$gc+1"
          fi
        fi
      else
        if [ "${buffer:0:6}" = "single" ]; then
          if [ $mode -eq 0 ]; then
            group=`echo $buffer|awk '{ print $1;}'`
            result=${buffer#$group}
            group=${group#single}
            group=${group%#}
            if [ $group>0 ]; then
              if [ $autohideSubbutton -eq 0 ]; then
                echo "./iconrun2c" $xmain $[ $ymain+$[ $[ $gc+1 ] * $[ $sizemain+$gapmain ] ] ] $sizemain $sizemain $raisemode $result &
                `echo "./iconrun2c" $xmain $[ $ymain+$[ $[ $gc+1 ] * $[ $sizemain+$gapmain ] ] ] $sizemain $sizemain $raisemode $result ` &
              else
                echo "./iconrun2d" $xmain $[ $ymain+$[ $[ $gc+1 ] * $[ $sizemain+$gapmain ] ] ] $sizemain $sizemain $raisemode $result
                `echo "./iconrun2d" $xmain $[ $ymain+$[ $[ $gc+1 ] * $[ $sizemain+$gapmain ] ] ] $sizemain $sizemain $raisemode $result ` &
              fi
              let "gc=$gc+1"
            fi
          fi
        else
          if [ $mode -eq 1 ]; then
            if [ $group -eq $selectedgroup ]; then
              if [ $autohideSubbutton -eq 0 ]; then
                echo "./iconrun2a" $[ $x+$gapsub+$[ $[ $sizesub+$gapsub ] * $i ] ] $[ $y-$[ $[ $sizesub-$sizemain ] / 2 ] ] $sizesub $sizesub $raisemode $buffer
                `echo "./iconrun2a" $[ $x+$gapsub+$[ $[ $sizesub+$gapsub ] * $i ] ] $[ $y-$[ $[ $sizesub-$sizemain ] / 2 ] ] $sizesub $sizesub $raisemode $buffer ` &
              else
                echo "./iconrun2b" $[ $x+$gapsub+$[ $[ $sizesub+$gapsub ] * $i ] ] $[ $y-$[ $[ $sizesub-$sizemain ] / 2 ] ] $sizesub $sizesub $raisemode $buffer
                `echo "./iconrun2b" $[ $x+$gapsub+$[ $[ $sizesub+$gapsub ] * $i ] ] $[ $y-$[ $[ $sizesub-$sizemain ] / 2 ] ] $sizesub $sizesub $raisemode $buffer ` &
              fi
              let "i=$i+1"
            fi
          fi
        fi
      fi
    fi
  fi
done < ../menu.rc
以上是一个shell,作用是从/menu.rc(配置文件)读取行,分析以后,调用“iconrun2b”等,分别显示一个图标。
/usr/share/icons/oxygen/48x48/devices/media-optical-dvd-video.png "dragon" "Dragon 媒体播放"
这是配置语句的一行,里面用了(双引号)作为转义符,一行作为iconrun2b的参数出现,形成下面的命令:

代码: 全选

./iconrun2c 100 864 64 64 1 /usr/share/icons/oxygen/48x48/devices/media-optical-dvd-video.png "dragon" "Dragon 媒体播放"
结果提示:
usage: iconrun2c x y width height lower/raise(0/1) image applicationToRun title
意思是参数数目不对。
其实,这条语句单独执行,是没有问题的,可是放到shell里面,一旦遇到双引号里面有空格的,就会报错。

请帮助,谢谢!!
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

Re: 这条语句单独执行,是没有问题的,可是放到shell里面,就会报错。怎么回事?

#2

帖子 枫叶饭团 » 2012-04-02 17:52

把空格换成\ 转义?
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 这条语句单独执行,是没有问题的,可是放到shell里面,就会报错。怎么回事?

#3

帖子 lilydjwg » 2012-04-02 17:58

不懂 bash。这种情况建议用 Python 解决。当然,C 也可以。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 这条语句单独执行,是没有问题的,可是放到shell里面,就会报错。怎么回事?

#4

帖子 fnan » 2012-04-02 20:59

这是配置语句的一行,里面用了(双引号)作为转义符,一行作为iconrun2b的参数出现,形成下面的命令:
代码:
./iconrun2c 100 864 64 64 1 /usr/share/icons/oxygen/48x48/devices/media-optical-dvd-video.png "dragon" "Dragon 媒体播放"
# 应该是命令没有正确形成,至少脚本里没见到引号。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
回复