LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1063|回复: 4

求助:一个shell里面运行命令的问题

[复制链接]
发表于 2009-10-18 06:52:07 | 显示全部楼层 |阅读模式
小弟最近在编写shell脚本的时候遇到了一个棘手的问题,我想把调用的程序名赋予一个变量cmd, 参数和文件名赋予一个变量cmdarg,为了要处理带空格的文件名,我想把变量cmdarg用双引号括起来:
比如:mplayer -ao oss 1 1.mp3这个命令(这个1 1.mp3是一个带空格的文件名),
我定义   
cmd="mplayer"
cmdarg="-ao oss 1 1.mp3"
然后运行 $cmd $cmdarg, 系统会提示:can't find 1.mp3,因为前面的1被忽略掉了,
如果我运行 $cmd "$cmdarg",系统会提示:Error parsing option on the command line: -ao oss 1 1.MP3
连字符的参数被忽略掉了。

因为实际脚本中需要处理参数和文件名混在一起的复杂情况,所以不太好把参数和文件名区别开,分别定义为不同的变量,
请教大家有没有好的方法,既可以识别文件名中的空格,又可以不对连字符-产生影响谢谢.
发表于 2009-10-18 07:28:14 | 显示全部楼层
Post by wubo;2037550
小弟最近在编写shell脚本的时候遇到了一个棘手的问题,我想把调用的程序名赋予一个变量cmd, 参数和文件名赋予一个变量cmdarg,为了要处理带空格的文件名,我想把变量cmdarg用双引号括起来:
比如:mplayer -ao oss 1 1.mp3这个命令(这个1 1.mp3是一个带空格的文件名),
我定义   
cmd="mplayer"
cmdarg="-ao oss 1 1.mp3"
然后运行 $cmd $cmdarg, 系统会提示:can't find 1.mp3,因为前面的1被忽略掉了,
如果我运行 $cmd "$cmdarg",系统会提示:Error parsing option on the command line: -ao oss 1 1.MP3
连字符的参数被忽略掉了。

因为实际脚本中需要处理参数和文件名混在一起的复杂情况,所以不太好把参数和文件名区别开,分别定义为不同的变量,
请教大家有没有好的方法,既可以识别文件名中的空格,又可以不对连字符-产生影响谢谢.
这是mplayer的问题。
cmdarg1=(-ao oss "1 1.mp3")
$cmd “${cmdarg1[@]}”试试
分离文件名在技术上总是可以做到的。
可以将所有的变量放到数组去,赋值的时候对变量加上引号,在数组中的参数是可以代空格的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-10-18 17:14:32 | 显示全部楼层
谢谢!这个在bash中是可以正常运行的,我现在用的是busybox,它里面只有ash, 不支持数组,我再想想有没有其他的方法,也许可以用awk的数组.
回复 支持 反对

使用道具 举报

发表于 2009-10-18 21:03:19 | 显示全部楼层
如果支持,可以考虑一下$IFS,设置特殊的符号如“:”代替空格作分隔符。将参数变量串用分隔符起来。
IFS=“ ”
ARG1=“SDASDA”
ARG2="DSFSDF"
ARG3="SDSD D"
AGR=“${ARG1}{ARG2}{ARG3}”
IFS=":"
$CMD $AGR
注意IFS是否对$CMD有影响,如$CMD是一个bash脚本。或者将$CMD放在子shell。
仅供参考。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-10-19 17:05:55 | 显示全部楼层
子shell是一个好办法,我昨天又重写了一遍解析脚本,现在能把参数和文件名分开来,所以 $cmd $cmdarg "$filename" 可以工作了,谢谢你!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表