免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2137 | 回复: 9

[文本处理] $*是如何显示命令行参数的??求解答.... [复制链接]

论坛徽章:
0
发表于 2016-05-15 14:01 |显示全部楼层
看了一些帖子,对  “$@”  和  “$*”  的用法理解了一些 。但对于不加引号的  $@ 和  $*  仍存在一些疑问:

创建如下简单的测试脚本:

#!/bin/bash
#test.sh

echo "$#"
for x in $*;do
    echo "[$x]"
done


运行脚本:./test.sh "" "" a b "" c ""


结果:
7
[a]
[b]
[c]

可以看到,脚本显示是有7个命令行参数。正常来讲,$*是一列表,由$1 $2 ...组成,所以在这里其输出也应该是遍历该列表,依次输出$1到$7。但实际结果和预期的不一样,更像是省略掉了空字符,不知这是什么原因。

另,存在一种和上述情形差不多但又不一样的例子:


#!/bin/bash
#test.sh


function fun(){

echo "$#"
for x in $*;do
      echo "[$x]"
done

}

IFS=":"
var='::a:b:c:::'
fun $var


与上个例子不同,这里只是把命令行参数放到了函数后面,但其输出和上个例子有很大差别:

运行 ./test.sh后输出:

7
[]
[]
[a]
[b]
[c]
[]


参数个数为7,为什么由$1 $2...组成的$*却只能输出6个字符??最后为何少输出一个  []  !!望大神能够解释一下,感谢!!

求职 : 技术支持/维
论坛徽章:
0
发表于 2016-05-15 21:41 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2016-05-15 22:23 |显示全部楼层
本帖最后由 150614 于 2016-05-15 22:28 编辑

回复 2# 99超人
看了下你给的链接 你说的应该是


echo 'IFS=":", using $*'
c=0
for i in $*
do echo "$((c+=1)): [$i]"
done

和上面的例子差不多。但是,看输出结果和我的好像还不太一样。Example 9-7的输出还算正常。

搞不明白,命令行明明是7个参数,为何输出时却少了一个的最后的空字符??结果中也不是所有的空字符都不输出。。

求职 : 技术支持/维
论坛徽章:
0
发表于 2016-05-26 16:34 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
发表于 2016-05-26 20:13 |显示全部楼层
楼主和楼上都是不懂$@/$*并且不懂 IFS,看看我的两篇博客吧
cnblogs.com/ziyunfei/p/4808530.html
cnblogs.com/ziyunfei/p/4898318.html

求职 : 技术支持/维
论坛徽章:
0
发表于 2016-05-27 09:39 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
发表于 2016-05-27 14:39 |显示全部楼层
回复 6# 99超人

我也忘了,应该当时是看文档和自己实验相结合,最终通过看 bash 源码确定这个逻辑的。
文档里有一句“any sequence of IFS characters not at the beginning or end serves to delimit words”

   

求职 : 技术支持/维
论坛徽章:
0
发表于 2016-05-27 15:15 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
6
程序设计版块每日发帖之星
日期:2016-05-11 06:20:00操作系统版块每日发帖之星
日期:2016-05-12 06:20:00每日论坛发贴之星
日期:2016-05-12 06:20:00操作系统版块每日发帖之星
日期:2016-05-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-31 06:20:00每日论坛发贴之星
日期:2016-05-31 06:20:00
发表于 2016-05-28 14:02 |显示全部楼层
  1. @A880:/storage/sdcard1/0e # sh 1.sh
  2. sh 1.sh
  3. : not found
  4. ' unexpectedtax error: '{
  5. 1|@A880:/storage/sdcard1/0e # cat 1.sh
  6. cat 1.sh
  7. #!/bin/bash

  8. function fun(){

  9. echo "$#"
  10. for x in $*;do
  11.       echo "[$x]"
  12. done

  13. }

  14. IFS=":"
  15. var='::a:b:c:::'
  16. fun $var@A880:/storage/sdcard1/0e #
复制代码

论坛徽章:
6
程序设计版块每日发帖之星
日期:2016-05-11 06:20:00操作系统版块每日发帖之星
日期:2016-05-12 06:20:00每日论坛发贴之星
日期:2016-05-12 06:20:00操作系统版块每日发帖之星
日期:2016-05-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-31 06:20:00每日论坛发贴之星
日期:2016-05-31 06:20:00
发表于 2016-05-28 14:04 |显示全部楼层
本帖最后由 1cpuer 于 2016-05-28 14:11 编辑

no find :
我晕,我在android 模拟器上运行的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP