【问题标题】:Calling linux utilities with options from within a Bash script使用 Bash 脚本中的选项调用 linux 实用程序
【发布时间】:2010-04-04 14:43:15
【问题描述】:

这是我的第一个 Bash 脚本,如果这个问题是微不足道的,请原谅我。我需要计算指定目录 $HOME/.junk 中的文件数。我认为这很简单,并假设以下方法可行:

numfiles= find $HOME/.junk -type f | wc -l
echo "There are $numfiles files in the .junk directory."

在命令行输入find $HOME/.junk -type f | wc -l 完全符合我的预期,只需返回文件数。为什么在我的脚本中输入它时不起作用?在将选项传递给实用程序时,我是否遗漏了一些特殊符号?

非常感谢您的时间和帮助。

【问题讨论】:

  • 请注意,您的“查找”命令是在环境变量“numfiles”设置为空字符串的情况下执行的。当您想要这样做时,这可能很有用(您可以在一个命令的持续时间内设置一个 env var 而不会影响父 shell),但是当您不知道它发生时会令人惊讶。

标签: bash scripting find utilities wc


【解决方案1】:

你只需要用反引号括起来:

numfiles=`find $HOME/.junk -type f | wc -l`

这个术语是command substitution

【讨论】:

  • @Kyle:不客气。当您在学习 Bash 脚本时遇到更多问题(或者如果您只是想“提前学习”),我强烈建议您阅读我的答案中链接的 Advanced Bash 脚本指南。
  • 我一定会好好利用这份指南,再次感谢马克。
  • 或者,更好的是,使用$(find $HOME/.junk -type f | wc -l)。嵌套$(...) 的问题比使用反引号要少。
【解决方案2】:

如果您使用的是 bash,您也可以使用 $() 进行命令替换,如下所示:

numfiles=$(find $HOME/.junk -type f | wc -l)

我发现这比反引号更具可读性,并且能够将多个命令相互嵌套。

【讨论】:

    【解决方案3】:

    使用 bash 4(如果你想要递归)

    #!/bin/bash
    shopt -s globstar
    for file in **
    do
     ((i++))
    done
    echo "total files: $i"
    

    如果没有

    #!/bin/bash
    shopt -s dotglob
    shopt -s nullglob
    for file in *
    do 
      ((i++))
    done 
    echo "total files: $i"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-20
      • 2014-12-09
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 2019-07-24
      • 1970-01-01
      • 2016-02-16
      相关资源
      最近更新 更多