Bash通配符在命令行中工作但不在脚本中工作

时间:2018-05-15 16:21:30

标签: bash macos

我在命令行ls中运行的基本$ ls [root]/*命令,我可以从中查看$root目录的内容。但是,当我在脚本中运行相同的命令时,我看到了这个错误:ls: [root]/*: No such file or directory。我将粘贴下面的脚本,但有人能够告诉为什么命令在命令行中运行正常而不是脚本吗?谢谢。

#! /bin/bash

root="[root]"
ls "$root/*"

修改

我追查了这个问题。除非我正在寻找具有该名称的文件或目录,否则通配符应该在双引号内。以下脚本成功运行。

#! /bin/bash

root="[root]"
ls "$root/"*

2 个答案:

答案 0 :(得分:0)

这里有一些问题。

  1. [root]是一个shell globbing模式,可匹配三个字符rot中的任何一个。如果您执行ls [root]并且您碰巧有一个名为rot的目录或文件,那么该模式将扩展为该文件或目录的名称。

    为了安全地列出真实姓名为[root]的目录的内容,您需要引用该名称,这将我们带到下一个点......

  2. shell globbing模式不会在引号中展开。这意味着"[root]/*"*目录中引用名为[root]的内容。

  3. 您的脚本必须看起来像

    #!/bin/sh
    
    root='[root]'
    ls "$root"/*
    

答案 1 :(得分:0)

我的问题的最佳答案是我对我的问题所做的编辑。我再说一遍。

我想在bash脚本中使用ls通配符并编写此文件:

#! /bin/bash

root="[root]"
ls "$root/*"

但是,以这种方式编写ls会查找名为*的文件或目录。为了使用通配符,我需要将*留在引号之外。请参阅以下示例:

#! /bin/bash

root="[root]"
ls "$root/"*

注意:

我在问题中使用方括号[]并在上下文中回答。我的目录名称不是文字字符串[root],而是其他内容,但方括号让读者理解上下文中的内容。

但是将来假冒的根路径或名称可能更好。