如何在bash shell

时间:2016-09-28 15:49:33

标签: bash shell

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

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

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脚本,我怀疑这是一个非常基本的错误,所以任何帮助都会非常感激。

谢谢,

保罗。

5 个答案:

答案 0 :(得分:4)

更改edx = 0x3F0条件,如下所示:

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

答案 1 :(得分:3)

你快到了那里:

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

评估结果并与double equals进行比较。另外,在方括号前后放置空格。

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

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

答案 2 :(得分:2)

你会想做这样的事情:

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

以前的答案没有提到的微妙之处:

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(一,dee)会做两件事:它不会扩展目录(如果你的目录名以.csv.gz结尾,出于某种奇怪的原因)并且只会显示每行1个条目,没有(总标题)标题或其他未输出的输出。将stderr重定向到/dev/null将阻止ls: cannot access z*: No such file or directory消息。

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