【问题标题】:Script variables in C-shellC-shell 中的脚本变量
【发布时间】:2013-05-05 13:30:12
【问题描述】:

有一个 my_grep 脚本

#!/bin/csh
cat $1 | grep -i -E " a | b "

怎么会

cat a* | grep -i -E " a | b " > out1.txt

my_grep a* > out2.txt

产生不同的结果?

【问题讨论】:

  • 不要使用 c-shell 编写脚本。谷歌“C shell 为什么不”。
  • 没错,但问题与shell无关;使用 bash 得到完全相同的结果。

标签: shell unix grep csh


【解决方案1】:

a* 在进入 shell 脚本之前会在 shell 中展开。因此,my_grep a* 将只给出以a 开头的第一个文件以供您的脚本处理。另一方面,cat a* 将适用于以a* 开头的所有文件。您可以将脚本更改为cat $*,这将达到预期的效果。

【讨论】:

  • $* 几乎从来都不是这个问题的最佳解决方案。在类似 sh 的 shell(bash、ksh、dash、sh)中使用 "$@",在类似 csh 的 shell(tcsh、csh)中使用 $*:q
【解决方案2】:

那是因为$1第一个 参数,而不是所有参数。

shell 会在您的脚本看到通配符之前将其扩展为单独的文件。

因此,如果您有以下两个文件 a1a2,则命令 my_grep a* 会将这两个文件提供给 $1$2,而您的脚本将只处理第一个文件。

【讨论】:

    【解决方案3】:

    快速解决方案:

    它们有所不同,因为您只在 my_grep 脚本中使用 FIRST glob 扩展 $1 ... 你的 my_grep 应该是:

    #!/bin/csh
    
    cat $* | grep -i -E " a | b "
    

    $* 是传递给 my_grep 的所有命令行参数。

    一些细节

    命令行shell(您实际输入my_grep a* 的地方是将a* 扩展到所有以a 开头的文件名,因此假设您的目录中有afoo abarabaz ,那么:

    cat a* | grep -i -E " a | b "

    本质上等同于:

    cat abar abaz afoo | grep -i -E " a | b "

    类似地当你做 my_grep a*

    相当于

    my_grep abar abaz afoo

    所以在你的 shell 脚本中 cat $1 意味着只是 cat abar 而不是 cat abar abaz afoo

    $* 等效于 $argv(等效于 $argv[*])。

    所以你的 my_grep 应该如上所示。

    【讨论】:

      猜你喜欢
      • 2011-10-23
      • 2011-06-07
      • 1970-01-01
      • 2013-12-14
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      相关资源
      最近更新 更多