【问题标题】:BASH if - if nothing providedBASH 如果 - 如果没有提供
【发布时间】:2014-01-09 21:30:28
【问题描述】:

我只在存在某种文件类型时才尝试执行任务 - 所以我有这个

if [ -e  `find /directory -type f -name "*.filetype" | head -1`];
      then ...

这总是评估为真(即使不存在这样的文件类型 - 我最终意识到这一点:

if [ -e ]

评估为真(即,如果没有给出任何内容 - 当我的条件没有找到文件类型时会发生这种情况) - 有谁知道我应该怎么做才能得到我需要的东西?

【问题讨论】:

    标签: bash shell unix makefile


    【解决方案1】:

    我最近学会了这项技术:

    if [[ $(find /directory -type f -name "*.filetype" 2>/dev/null) ]]; then
        ...
    fi
    
    • 我们将 stderr 重定向到 /dev/null 以隐藏任何错误消息
    • 如果文件同时满足这两个条件,find 的输出将为非空白,否则为空白。
    • 如果 find 的输出为非空白或空白,[[ ... ]] 的计算结果分别为 true 或 false。

    我之前用过不同的版本:

    if find /directory -type f -name "*.filetype" 2>/dev/null | grep -q .; then
        ...
    fi
    

    但这不太好,因为它使用了一个额外的grep 进程。第一个解决方案通过单个find 进程实现了相同的效果。

    【讨论】:

    • $(find ...) 评估为错误或引发错误的东西是否完全没有风险?我用名为'1 == 2''&&' 的文件进行了测试,它工作正常,但我想知道是否完全没有风险。
    • @damienfrancois,在 [[ ... ]] 内的 bash 中,变量进行分词,所以这个构造只会检查输出的字符串长度。
    【解决方案2】:

    如果使用

    ,您的行会是正确的
    if [ -n "`find /directory -type f -name '*.filetype'`" ] ;
    

    -n 测试非空字符串。

    如 cmets 中所述,反引号语法已被弃用,取而代之的是 $() 语法。

    【讨论】:

    • 对于没有结果的有效查询,哪个版本的 find 返回非零值?
    • @glennjackman 嗯,我在脑子里搞混了。感谢您的反馈。
    • 这不起作用的原因与原始原因相同:[ -n ] 返回 true,因为当 [ 命令只看到一个项目(“-n”)时,它会检查查看它是否为非空白,如果是则返回 true。换句话说,它将“-n”视为要测试的字符串而不是运算符。解决方案是双引号命令替换部分:if [ -n "$(find ... head -1)" ]; then - 请注意,我使用了$() 而不是反引号,因为语法更简洁,而且] 之前的空格是必需的。
    • 我不明白为什么@Janos 的回答会更好。这是与 POSIX 兼容、简单且直接的。
    • @damienfrancois 1. 您在其中留下了一个反引号,但没有关闭它。 2. 既然$()受宠,何不这样写呢? 3.-n是不必要的:非空字符串为“true”,空字符串为“false”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    相关资源
    最近更新 更多