shell 脚本参数空格问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
自由建客
论坛版主
帖子: 13442
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64
来自: freebuilder@yeah.net
送出感谢: 12 次
接收感谢: 112 次
联系:

shell 脚本参数空格问题

#1

帖子 自由建客 » 2010-12-03 11:57

代码: 全选

#!/bin/sh
VIMRC=/etc/vimide/vimrc
vim -u "$VIMRC" $@
若系统传递给该脚本的某个文件名中含有空格,再经 $@ 这么一传就变成了两个参数了。
我要的效果是
vim -u "$VIMRC" "$1" "$2" ...
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

Re: shell 脚本参数空格问题

#2

帖子 eexpress » 2010-12-03 12:13

bash dash。。都会对参数解释,去掉各种“引号等。
基本只按照空格处理。
你可以使用''包括参数。脚本里面取的后,传给其他软件的时候,还要''包裹一次。
● 鸣学
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30
送出感谢: 2 次
接收感谢: 31 次

Re: shell 脚本参数空格问题

#3

帖子 aerofox » 2010-12-03 20:24

把 $@ 加上双引号就是了:"$@"
头像
byZh
帖子: 198
注册时间: 2009-01-11 21:38
送出感谢: 0
接收感谢: 0

Re: shell 脚本参数空格问题

#4

帖子 byZh » 2010-12-04 10:26

把带空格的参数用 "" 引起来

代码: 全选

./yourscript "my file" "my file1"
$@也要用 "" 引起来才行
以缺德服人......
头像
自由建客
论坛版主
帖子: 13442
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64
来自: freebuilder@yeah.net
送出感谢: 12 次
接收感谢: 112 次
联系:

Re: shell 脚本参数空格问题

#5

帖子 自由建客 » 2010-12-04 17:14

eexpress 写了:bash dash。。都会对参数解释,去掉各种“引号等。
基本只按照空格处理。
你可以使用''包括参数。脚本里面取的后,传给其他软件的时候,还要''包裹一次。
当参数传递给脚本的时候,该解析的已经解析了,问题就在于 $@ 引用的是不带引号的众参数。文档虽然说
if $1 is “abc” and $2 is “def ghi”, then "$@" expands to the two arguments:
"abc" "def ghi"
但实际上

代码: 全选

$@ 得到
abc def ghi
"$@" 得到
"abc def ghi"
实际点的就是,在 shell 敲这样一条命令

代码: 全选

vimide "my main.c" "makefile"
这个交互式 shell 没有任何问题,把两个参数传给了 vimide 脚本。但通过脚本后就成了这样一条命令

代码: 全选

vim -u /etc/vimide/vimrc my main.c makefile
传给 vim 的,成了三个文件。若把 $@ 用引号引起来,那样一样有问题,得到了

代码: 全选

vim -u /etc/vimide/vimrc "my main.c makefile"
好家伙!成一个文件了。

用 C 语言写个程序代替 vimide 脚本很简单地解决了,但没找到 shell 的解决方法。
tusooa
帖子: 6546
注册时间: 2008-10-31 22:12
系统: 践兔
送出感谢: 6 次
接收感谢: 10 次
联系:

Re: shell 脚本参数空格问题

#6

帖子 tusooa » 2010-12-05 19:43

楼上,你自己试试。就知道了。

代码: 全选

sh-4.1$ set a b 'c d e'
sh-4.1$ for i in $@ ; do echo "$i" ; done
a
b
c
d
e
sh-4.1$ for i in "$@" ; do echo "$i" ; done
a
b
c d e
sh-4.1$ 
纯属不实践的。

代码: 全选

] ls -ld //
tusooa
帖子: 6546
注册时间: 2008-10-31 22:12
系统: 践兔
送出感谢: 6 次
接收感谢: 10 次
联系:

Re: shell 脚本参数空格问题

#7

帖子 tusooa » 2010-12-05 19:46

实际上,
如果参数是"a" "b" "c d e"

$* 会返回 a b c d e
"$*" 会返回 "a b c d e"
不要把$*和$@搞混了。

代码: 全选

] ls -ld //
头像
自由建客
论坛版主
帖子: 13442
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64
来自: freebuilder@yeah.net
送出感谢: 12 次
接收感谢: 112 次
联系:

Re: shell 脚本参数空格问题

#8

帖子 自由建客 » 2010-12-06 19:41

理论上是可行的,别人的也可行,就自己的不行。我只能说是灵异了,和下面这种问题一样,除了重装系统,没办法解决。
viewtopic.php?f=70&t=302465
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30
送出感谢: 2 次
接收感谢: 31 次

Re: shell 脚本参数空格问题

#9

帖子 aerofox » 2010-12-06 22:53

跟重装没有任何关系。
行不行别空口说,把代码和输入、输出结果原封不动地贴出来看看。
回复

回到 “Shell脚本”