注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Tsecer的回音岛

Tsecer的博客

 
 
 

日志

 
 

bash -f选项  

2013-03-18 23:47:07|  分类: 脚本语言 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、各种诡异
bash的语法应该是最为灾难的一种语法了,或许perl也是吧,不过用的不多,用的多的bash感觉各种奇技淫巧的语法。
话说是今天想测试一个shell脚本的功能,然后习惯性的在执行脚本的时候加上了一个 -f 选项
sh -f myscript.sh
然后里面就遇到一个函数参数中的文件通配符始终无法被展开。查看了一下bash的man手册和bash的官方文档,都没有说这个-f到底是一个什么选项,它根本没有出现在文档里。
只要看bash的源代码,在其中很快就找到了这个选项的定义。
const struct flags_alist shell_flags[] = {
  /* Standard sh flags. */
  { 'a', &mark_modified_vars },
#if defined (JOB_CONTROL)
  { 'b', &asynchronous_notification },
#endif /* JOB_CONTROL */
  { 'e', &exit_immediately_on_error },
  { 'f', &disallow_filename_globbing },
  { 'h', &hashing_enabled },
  { 'i', &forced_interactive },
  { 'k', &place_keywords_in_env },
#if defined (JOB_CONTROL)
  { 'm', &jobs_m_flag },
#endif /* JOB_CONTROL */
  { 'n', &read_but_dont_execute },
  { 'p', &privileged_mode },
#if defined (RESTRICTED_SHELL)
  { 'r', &restricted },
#endif /* RESTRICTED_SHELL */
  { 't', &just_one_command },
  { 'u', &unbound_vars_is_error },
  { 'v', &echo_input_at_read },
  { 'x', &echo_command_at_execute },

  /* New flags that control non-standard things. */
#if 0
  { 'l', &lexical_scoping },
#endif
#if defined (BRACE_EXPANSION)
  { 'B', &brace_expansion },
#endif
  { 'C', &noclobber },
  { 'E', &error_trace_mode },
#if defined (BANG_HISTORY)
  { 'H', &history_expansion },
#endif /* BANG_HISTORY */
  { 'I', &no_invisible_vars },
  { 'P', &no_symbolic_links },
  { 'T', &function_trace_mode },
  {0, (int *)NULL}
};
大家可能觉得这是画蛇添足了,但是在perl grep make中,指定脚本都是通过这个选项设置的。偏偏bash中的这个选项就是禁止文件名的通配符展开。事实上这个东西是和set中设置的选项类似的。
二、awk中提取某些域的值为特定值的实现
问题是想从awk中提取特定域为特定值的某一行输出。一般来说,通过awk中
'{if ($field = $var)}'
形式展开,此时的field是一个常数,var是一个脚本中读取的变量,此时整个表达式是使用单引号引用的,这样避免$field被展开,但是同时也组织了var变量的值传入到awk的表达式中。
此时使用了一个非常没有节操的做法,就是把文件输出的行进行转换,也就是把var的值以输入中的通配符形式添加到输入行的开始,这样就可以在awk中
$field=$1
的形式来判断。
再详细点说:
cat orginfile | sed -e "s/^/$var/" | awk '{if($1==$field)}'
不知道大家看懂是啥意思没有,不过没关系,不太实用的,也不太好玩。我甚至想
awk '{if($1=='$field')}'
这种形式也是可以的,只是看起来有些触目惊心。
  评论这张
 
阅读(627)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017