【问题标题】:bash script is taking fixed argument values instead of those actually passedbash 脚本采用固定参数值而不是实际传递的参数值
【发布时间】:2011-02-07 18:52:46
【问题描述】:

我有简单的 bash 脚本 find.sh 来查找文件

==>cat find.sh

echo $1

find -name $1

但有时它不会采用正确的参数,而是采用固定的参数

例如

find.sh 'ECSv2_P_TCP_FUNC_060*'

ECSv2_P_TCP_FUNC_060 ECSv2_P_TCP_FUNC_060.backup

虽然我在这里传递了“ECSv2_P_TCP_FUNC_060*”,但它已将 ECSv2_P_TCP_FUNC_060 ECSv2_P_TCP_FUNC_060.backup 这些作为参数。

为什么会这样? 以及如何避免这种情况?

【问题讨论】:

    标签: bash shell command-line-arguments


    【解决方案1】:

    您还需要保护 * 字符免受脚本内的 shell 扩展:

    echo "$1"
    find . -name "$1"
    

    (已编辑以包含当前目录作为 find 的参数。)

    【讨论】:

      【解决方案2】:

      您的脚本确实接受了参数,但是脚本在将 * 传递给 echo 之前扩展了它,并且 find 正在读取参数并解释 *. (实际上,find 可能是在轰炸,因为第一个参数应该是一个目录。例如,'find . -name $1')

      【讨论】:

      • 至少在 GNU find 中,手册页指出:“如果没有给出路径,则使用当前目录。”
      • @Christoph 其他发现将其视为语法错误。 (BSD find 当然可以!)
      • 非常感谢!!结合答案1和2解决了我的问题。我缺少引号以及 .指定目录所必需的。
      • @Christopher:如果参数是一个 glob,那就不同了。将 GNU find 与当前目录中名为“foo.txt”的现有文件以及该文件下的子目录中的同名文件和一个名为“foo.txt.bak”的文件以及两个级别的其他一些文件一起使用,比较find foo.*find "foo.*", find 中的每一个。 "foo.*", find -name "foo.*", find 。 -name "foo.*"` 和 find . -name foo.*.
      猜你喜欢
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 2018-03-03
      • 2021-11-18
      • 2012-12-29
      相关资源
      最近更新 更多