免费注册 查看新帖 |

Chinaunix

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

[学习共享] 问一个csh下echo和quote的问题,怎么和bash那么大差异~~~ [复制链接]

论坛徽章:
0
发表于 2012-08-11 21:31 |显示全部楼层
本帖最后由 yifengvic 于 2012-08-11 21:39 编辑

1、csh中是否有IFS一说?
在csh中:
  1. set a=b c;
  2. echo $a;
  3. b
复制代码
b和c之间的空格怎么解释?在bash里面的话就直接报error了
在csh中没找到$IFS这个变量,csh在这里是怎么来分解command line的?

2、关于csh中的hard quote
在bash中hard quote中所有的meta都失去特殊意义,这条规则在csh中不适用吗?
  1. set a='hello #hello后直接回车,hard quote中enter难道没被关闭,被csh识别成CR了?
  2. unmatched. #报error
复制代码
在bash中完全没问题(只有下面这个code块是bash环境,其他都是csh环境):
  1. a='hello  #hello后直接回车,在hard soft里面enter的CR功能被关闭了,只作为换行符而已
  2. world'
  3. echo $a
  4. hello world
复制代码
  1. set a='hello\   #escape(\)后直接回车
  2. world'
  3. echo $a
  4. hello__world #这里用下划线表示空格,怎么是两个空格?
复制代码
3、bash中的soft quote中,escape只在以下5种情况下有作用:
\$、\`、\\、\"、\newline,其他情况(\x)都表示\符号和x字符,但是在csh中貌似不是这样:

csh中的echo要使能转义字符,需要设置echo_style变量:
A、set echo_style=both #打开转义使能:
  1. echo "hello\$world" #不管是哪种shell,我觉得这个command line,应该是先解释soft quote(这里csh到底是怎么解释的???),解释完之后在当做arguments送给echo命令处理
  2. world:undefined variable   #竟然报这个error,那在soft quote中怎么表示$符号本身?
复制代码
  1. echo "hello\`world"
  2. unmatched #soft quote中如何关掉`功能?
复制代码
  1. echo "hello\"world"
  2. unmatched. #???
复制代码
  1. echo "hello\ #\后直接回车
  2. world"
  3. hello
  4. world  #这个地方如何解释?貌似在hard/soft quote中,\newline对表示纯粹的newline换行符
复制代码
  1. echo "hello\\world"
  2. hello\world #我认为这是echo对转义字符\\的作用,如果echo关闭转义字符使能,就变成\\了,后面会有
复制代码
B、set echo_style=bsd  #关闭转义使能
  1. echo "hello\$world"
  2. world:undefined variable
复制代码
  1. echo "hello\`world"
  2. unmatched
复制代码
  1. echo "hello\"world"
  2. unmatched
复制代码
  1. echo "hello\ #\后直接回车
  2. world"
  3. hello
  4. world
复制代码
  1. echo "hello\\world"
  2. hello\\world  #关闭了转义使能
复制代码

论坛徽章:
0
发表于 2012-08-11 23:45 |显示全部楼层
在一篇文章《Why shouldn't I program in csh?》
http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/#b
中看到关于csh的quoting描述,绝望了~~~~~~

4. QUOTING

You can't quote things reasonably in the csh:

    set foo = "Bill asked, \"How's tricks?\""

doesn't work.  This makes it really hard to construct strings with
mixed quotes in them.  In the Bourne shell, this works just fine.
In fact, so does this:

     cd /mnt; /usr/ucb/finger -m -s `ls \`u\``

Dollar signs cannot be escaped in double quotes in the csh.  Ug.

    set foo = "this is a \$dollar quoted and this is $HOME not quoted"
    dollar: Undefined variable.

You have to use backslashes for newlines, and it's just darn hard to
get them into strings sometimes.

    set foo = "this \
    and that";
    echo $foo
    this  and that
    echo "$foo"
    Unmatched ".  

Say what?  You don't have these problems in the Bourne shell, where it's
just fine to write things like this:

    echo         'This is
             some text that contains
             several newlines.'


As distributed, quoting history references is a challenge.  Consider:

    % mail adec23!alberta!pixel.Convex.COM!tchrist
    alberta!pixel.Convex.COM!tchri: Event not found.

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
发表于 2012-08-12 09:52 |显示全部楼层
回复 2# yifengvic


   
绝望了~~~~~~




还好,没用 csh。

不过据说功能也很强大。

论坛徽章:
0
发表于 2012-08-12 17:42 |显示全部楼层
看了半天man csh,自己总结一下吧,不见得都正确:

在substitution方面的作用:
1、Single quote作用:除history substitution外的所有替换,在single quote中被关闭(和bash中hard quote比较类似),但man csh只说了对substitution的处理,也没说如何处理meta,比如在single quote中直接newline的话,会报‘unmatched’滴~~~

2、double quote作用:只接受变量替换和命令替换,像alias substitution、history substitution这些就替换不了;同样double quote中直接newline,也会送你‘unmatched’滴~~~

3、backward quote作用:只接受变量替换和命令替换;

4、backslash作用:单独使用\(不和其他quote嵌套使用)时,关闭对应的替换(所有类型的替换);
在single quote中,$、反引号仅表示符号本身,而backslash的escape作用大部分关闭(除了\newline,\newline被csh当做空格)
在double quote中,\$、\`、\"没有escape作用,靠,怎么就没啥规律呢~~~~~~~~~~~~~~~~~~~~~~

反正quote的嵌套使用,我真心不知道有啥规律

5、
'\newline':被csh当空格
"\newline":被csh当换行
\newline不在single/double quote中:被csh当空格
任何地方的单独newline:被csh当CR


PS:很纳闷,csh自己都在说嵌套quote很confusing,但也不给出solution~~~~~~:
Quoting complex strings, particularly strings which themselves contain quoting characters, can be confusing. Remember that quotes need not be used as they are in human writing! It may be easier to quote not an entire string, but only those parts of the string which need quoting, using different types of quoting to do so if appropriate.
不是公司的默认环境是csh的话,真不想花太多时间看csh(还是bash正统~~~)抓狂。。。。。。。。。。

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
发表于 2012-08-13 09:07 |显示全部楼层
set a=b c
在csh中的意思是 a=b c=''
在bash中的意思是$1="a=b" $2=c
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP