LinuxSir.cn,穿越时空的Linuxsir!

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

关于命令行参数的问题[已解决]

[复制链接]
发表于 2004-12-14 22:17:27 | 显示全部楼层 |阅读模式
如果我将一个字符串当作参数传给一个命令,那么他中间的所有空格都被当作参数分割符,我想问如果我想保留某些空格,也就是将几个字符和起来组成一个带有空格的字符串参数,具体怎么实现呢,我曾经试过在字符串中加上\作为空格的转义,但是好象根本就不起作用,请大家不吝赐教,谢谢了。

  1. a="first second"
  2. function fd(){
  3.     echo $#
  4.     echo $@
  5. }

  6. fd $a
复制代码
发表于 2004-12-15 00:17:01 | 显示全部楼层
a="first second"
IFS_ORIG=$IFS
IFS=:
function fd(){
    echo $#
    echo $@
}

fd $a
IFS=$IFS_ORIG
发表于 2004-12-15 00:34:03 | 显示全部楼层

回复: 关于命令行参数的问题

最初由 小锁 发表
如果我将一个字符串当作参数传给一个命令,那么他中间的所有空格都被当作参数分割符,我想问如果我想保留某些空格,也就是将几个字符和起来组成一个带有空格的字符串参数,具体怎么实现呢,我曾经试过在字符串中加上\作为空格的转义,但是好象根本就不起作用,请大家不吝赐教,谢谢了。

  1. a="first second"
  2. function fd(){
  3.     echo $#
  4.     echo $@
  5. }

  6. fd $a
复制代码


命令行参数可用双引号来限定,如"first second"表示一个参数而不是两个参数,兄弟此例可改为下面的
  1. a="first second"
  2. function fd(){
  3.      echo $#
  4.      echo $@
  5. }  
  6. fd "$a"
复制代码
 楼主| 发表于 2004-12-15 01:35:47 | 显示全部楼层
设置IFS这个办法不错
kiron兄,你的那个方法对于“a b \"c  d\" "这样的情况不奏效,也不是我要得方法
不过还是谢谢了。
顺便问一下${string//substring/replacement},这样的替换处理,substring好象不是正则表达式,不知道是什么原则,希望大家指点!
发表于 2004-12-15 02:15:08 | 显示全部楼层
1. 如果用$#或$@, 那么就得判断参数的值。 比如, 如果第二个参数是-f,那么第三个参数就是文件名。类似这样的判断用到if,while, for, case的结构中,再加上shift,就可以编写很长参数的命令。
2。 可以考虑getopts方法。 这个在home_king版主的帖中有详细的论述。
发表于 2004-12-15 02:34:37 | 显示全部楼层
shell>./test_param.sh first second
---------------------------------------------------

  1. #!/bin/bash

  2. IFS_ORIG=$IFS
  3. IFS=:
  4. function fd(){
  5. echo $#
  6. echo $@
  7. }

  8. fd "$@"
  9. IFS=$IFS_ORIG
复制代码

如果把参数放到程序的position param位置, 除了给参数加引号,否则测试出来结果还是2个参数。 无论是否修改IFS的值。
发表于 2004-12-15 10:21:26 | 显示全部楼层
最初由 小锁 发表
设置IFS这个办法不错
kiron兄,你的那个方法对于“a b \"c  d\" "这样的情况不奏效,也不是我要得方法
不过还是谢谢了。
顺便问一下${string//substring/replacement},这样的替换处理,substring好象不是正则表达式,不知道是什么原则,希望大家指点!


不知兄弟是如何测试的,但在我的机器里,可以显示出整个字符串]
脚本文件:

  1. #!/bin/bash

  2. a="hello hi " hel""
  3. function fd()
  4. {
  5. echo $#
  6. echo $@
  7. }

  8. fd "$a"
复制代码


输出:
  1. 1
  2. hello hi " hel"
复制代码
 楼主| 发表于 2004-12-15 12:29:17 | 显示全部楼层
最初由 kiron 发表
不知兄弟是如何测试的,但在我的机器里,可以显示出整个字符串]
脚本文件:

  1. #!/bin/bash

  2. a="hello hi /" hel/""
  3. function fd()
  4. {
  5. echo $#
  6. echo $@
  7. }

  8. fd "$a"
复制代码


输出:
  1. [color=red]1[/color]#我的意思是应该是三个参数才对!
  2. hello hi " hel"
复制代码
发表于 2004-12-15 12:52:04 | 显示全部楼层
最初由 小锁 发表

这好象和你在一楼的要求不符啊
我都看糊涂了试一下用$*代替$@
我不在linux下,没法测试
发表于 2004-12-15 15:02:02 | 显示全部楼层
我误解小锁兄弟的意思了,sorry
小锁兄弟的意思是对于一个字符串sdfsd "sdf  sdfsdf",把它传递给一个命令作为参数,这样,这个命令的参数就是有两个.
这个问题的解决办法我想可以这样:
关于shell的特性:对于一条命令行,只对其进行一次解析.
也就是说,shell对一条命令行的程序名,参数等的分割只是一次,下面是我的测试:
  1. $AA="hello "he llo ""
  2. $echo $AA
  3. hello "he llo "
  4. $echo `echo $AA`
  5. hello "he llo "
复制代码


若要对于两次解析,可以用shell内建的eval对命令行再次解析如下:
  1. $eval echo `echo $AA`
  2. hello he llo
复制代码


上面两次解析之后,对变量$AA中的引号也去掉了,实际把$AA解析成了两个参数.再回到小锁兄弟提出的问题上来,代码如下:
  1. #!/bin/bash

  2. a="hello hi " hel""
  3. function fd()
  4. {
  5. echo $#
  6. echo $@
  7. }

  8. fd "$a"
复制代码

输出变成了:
  1. 3
  2. hello hi  hel
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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