【问题标题】:if statement in KornShell scriptKornShell 脚本中的 if 语句
【发布时间】:2011-10-17 03:53:21
【问题描述】:

我有以下 if 语句。当我在文件夹中有 csv 文件和 zip 文件时,它会给我语法错误。但是当我只有 csv 文件或 zip 文件或不存在文件时,它可以工作。

我不确定是什么导致了以下命令中的语法错误:

if [ -f ctf_error_report_??_????????????.csv -o -f ctf_error_report_??_????????????.???.zip ];
then
     echo  "Successful"
else
     echo  "Problem"
fi
exit 0

对此有何见解?

【问题讨论】:

  • 使用ksh -x your-script 查看执行了什么。文件名扩展表达式可能会产生多个文件名,正如其他人在他们的答案中所诊断的那样。

标签: linux shell unix ksh


【解决方案1】:

这是检查文件的危险方法。如果您碰巧在该目录中有多个匹配项,那么它将不起作用,因为每个文件都将成为一个单独的参数,这与文本的语法不匹配。一个更好(虽然不是万无一失)的方法是这样的:

set ctf_error_report_??_????????????.csv
csv_file=$1
set ctf_error_report_??_????????????.???.zip
zip_file=$1

if [ -f "$csv_file" -o -f "$zip_file" ]
then
  echo  "Successful"
else
  echo  "Problem"
fi

【讨论】:

  • 也可以说:set ...?.csv; n_csvfiles=$#; set ...?.???.zip; n_zipfiles=$#; if [ $n_csvfiles -gt 0 -0 $nzipfiles -gt 0 ]; ...
  • 这行不通,因为如果通配符模式不匹配任何内容,它将不会被替换,并且 $n_csvfiles 将为 1。
【解决方案2】:

我怀疑您需要这个来测试某些文件传输或报告生成脚本的成功(我关闭了吗?)。我会这样做(可能不是最好的,但应该可以)是这样的:

#!/bin/bash
FILE_FOUND=0
ls ./ctf_error_report_??_????????????.csv &>/dev/null
if [ $? -eq 0 ]; then
  FILE_FOUND=1
fi

ls ./ctf_error_report_??_????????????.???.zip &>/dev/null
if [ $? -eq 0 ]; then
  FILE_FOUND=1
fi

if [ $FILE_FOUND -eq 1 ]; then
  echo "Successful"
else
  echo "Problem"
fi

当您在脚本目录中找到您要查找的文件模式时,这将返回成功。当然,您可以将 ./ 更改为文件的完整路径...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多