【问题标题】:How do I use the output of an ls command in an if statement in a bash shell [duplicate]如何在 bash shell 的 if 语句中使用 ls 命令的输出 [重复]
【发布时间】:2017-02-06 17:04:39
【问题描述】:

我想在继续处理该文件之前检查该文件是否只存在一个实例。

我可以使用这个命令检查有多少实例存在:

ls -l $INPUT_DIR/${INPUT_FILE_PREFIX}cons*.csv.gz | wc -l;

但是,当我在 if 语句中使用它时,会警告我 ls: command not found.

if [ls -l $INPUT_DIR/${INPUT_FILE_PREFIX}cons*.csv.gz | wc -l = '1']
 then
 echo "Only 1 File Exists";
fi

我尝试在 ls 命令的末尾添加分号并将其括在方括号中 - 这些都没有产生任何结果。

我很少需要编写任何 Shell 脚本,我怀疑这是一个非常基本的错误,因此非常感谢任何帮助。

【问题讨论】:

标签: bash shell


【解决方案1】:

你会想做这样的事情:

if [[ $(ls -l $INPUT_DIR/${INPUT_FILE_PREFIX}cons*.csv.gz | wc -l) == '1' ]]; then
  # Something
fi

$(command) 语法捕获输出。我不确定相等比较是否正确,但根据这个stackoverflow 它是。

【讨论】:

  • 你测试过吗?
  • @Jean-FrançoisFabre 不,我没有,但它通常对我有用。在这方面我是初学者,但学习是一件很棒的事情!
【解决方案2】:

如下更改您的if 条件:

if [ "$(ls -l $INPUT_DIR/${INPUT_FILE_PREFIX}cons*.csv.gz | wc -l)" = "1" ]
  • [ 之后和] 之前需要有一个空格
  • $() 中运行命令将调用一个子shell 并运行该命令。
  • $() 放在双引号内可避免在输出为空时引发错误。

【讨论】:

  • 在输出为空时过滤错误对我不起作用(使用旧的 MSYS bash 3,也许它只是 bash 4,如果指定它会很有用)
【解决方案3】:

你快到了:

if [ $(ls $INPUT_DIR/${INPUT_FILE_PREFIX}cons*.csv.gz 2>/dev/null | wc -l) == 1 ]
 then
 echo "Only 1 File Exists";
fi

计算结果并与双等号进行比较。另外,在方括号前后放置空格。

另外,过滤掉没有文件匹配的情况(避免no such file or directory错误)

注意:您甚至不需要-l 选项。当输出到非交互式终端(即文件或管道)时,ls 每个文件发出 1 行。您也可以使用 -C1 选项强制它。您将获得 3 纳秒(至少 :))不执行额外的 stat 调用来获取不需要的日期、大小等。

【讨论】:

  • 过滤无匹配项的第一名 - 谢谢。
【解决方案4】:

我希望检查文件是否存在不需要“-l”选项。我们也可以使用命令替换来获得相同的结果。

#!/bin/bash    
if [ `ls -l $INPUT_DIR/${INPUT_FILE_PREFIX}cons*.csv.gz | wc -l` -eq 1 ];then
    echo "One exists"
fi

【讨论】:

  • @paulfrith 我也是alias l='ls -lrth' :-)
【解决方案5】:

之前的答案没有涵盖的一些微妙之处:

if [ "$(ls -1d $INPUT_DIR/${INPUT_FILE_PREFIX}cons*.csv.gz 2>/dev/null | wc -l)" -eq 1 ]; then 
  echo 'Only 1 file';
fi

第一次使用 -1d (one, dee) 会做 2 件事:它不会扩展目录(如果出于某种奇怪的原因您的目录名称以 .csv.gz 结尾)并且每行仅显示 1 个条目没有(总标题)标题或其他不需要的输出。将 stderr 重定向到 /dev/null 将阻止 ls: cannot access z*: No such file or directory消息。

最后,您应该使用=-eq,因为如果使用单个[ 测试运算符(如果您关心bash/zsh 兼容性),== 与 zsh 不兼容。此外,BSD/OSX wc 在输出中放置了一些前导空格,因此您可能希望通过管道连接到 awk 以去除以便进行比较。

【讨论】:

    猜你喜欢
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多