【问题标题】:shell to find a file , execute it - exit if 'error' and continue if ' no error'shell 查找文件,执行它 - 如果“错误”则退出,如果“无错误”则继续
【发布时间】:2012-07-20 16:53:42
【问题描述】:

我必须编写一个 shell 脚本,但我不知道该怎么做。 基本上我必须编写一个脚本来找到一个文件(它可能会以不同的方式命名)。如果任一文件存在,则必须执行,如果返回 0(无错误),则应继续构建,如果不等于 0(返回错误),则应退出。如果没有找到任何一个文件,它应该继续构建。

我必须找到的文件可以是 file.1 或 file.2,因此它可以命名为 (file.1) 或 (file.2)。

一些条件使它更清楚。 1)如果任何一个文件存在,它应该执行 - 如果它有任何错误它应该退出,如果没有错误它应该继续。 2)不存在,如果是这种情况,那么它应该继续构建。 3) 两个文件不会同时出现(附加信息)

我曾尝试编写一个脚本,但我怀疑它是否更接近我正在寻找的内容。

if [-f /home/(file.1) 或 (file.2)] 然后 -exec /home/(file.1) 或 (file.2) 如果 [ $! -eq 0];然后 echo "没有错误继续构建" 菲 别的 如果 [ $! -ne 0] ;然后 出口 ; 菲 别的 echo "/home/(file.1) 或 (file.2) 未找到,继续构建" 菲

非常感谢任何帮助。

提前致谢

【问题讨论】:

  • 如何执行 XML 文件?
  • 所以澄清一下,这是正确的:当且仅当(1)两者都不存在,或者(2)其中至少一个存在并且在运行时成功?
  • Ray,文件可以退出,甚至没有一个可以退出。 (两者不会同时出现)。 1)我想找到该文件,如果存在则应该执行。2)如果执行时有任何错误,则应退出,3)如果执行时没有错误,则不应退出,4)如果没有文件现在它不应该退出。
  • 有四种情况需要考虑:(1) 两个文件都找到,(2) 和(3) 找到其中一个文件,(4) 两个文件都没有找到。您的描述没有清楚地(在我看来)说明在情况(1)和(4)中该怎么做。在编程时,您确实必须考虑所有类似的可能性,并确保您知道在每种情况下您将要做什么。此外,Unix 上的“查找文件”通常意味着“运行find 命令来定位文件”。尚不完全清楚,但从您的示例代码中,您似乎知道这两个文件的位置,如果它们在任何地方找到的话。
  • @JonathanLeffler 1) 两个文件不会同时出现,4) 如果两个文件都没有找到,它应该继续,而不是退出。我希望它很清楚

标签: linux bash shell find


【解决方案1】:

只是放线

file.sh

如果您将脚本设置为在出错时退出,那么您的脚本应该可以工作。

例如,如果您的脚本是

#!/bin/bash -e
echo one
./file.sh
echo two

然后,如果file.sh 存在并且是可执行的,它将运行并且您的整个脚本将运行。否则,脚本在尝试执行不存在的文件时会失败。

如果您想执行一个文件或另一个,请将想法扩展到以下内容:

#!/bin/bash -e
echo one
./file1.sh || ./file2.sh
echo two

这意味着如果file1.sh 不存在,它将尝试file2.sh,如果存在,它将运行并且您的整个脚本将运行。

这当然优先考虑file1,这意味着如果它们都存在,那么只有file1会运行。

【讨论】:

  • 如果 file.sh 不存在,则不会尝试执行 file.xml
  • 我不知道如何执行file.xml,所以我使用了file2.sh。哦,实际上如果你以某种方式使file.xml 可执行......你能澄清一下吗?
  • file1||file2 在我最初查看您的答案时不存在,但这也有问题。如果 file1 存在但返回错误,它不会出错,而是尝试执行 file2(理论上它可能存在并返回成功)。
  • 让我们将它们命名为 file1 和 file2 以使其更容易。
  • 好点,赛斯,我误读了这个问题。我认为 OP 想要找到并执行一个或另一个,如果一个失败,则执行另一个,如果他们都失败了,那将是一个错误。这个问题起初看起来像“你必须执行一个或另一个”。
【解决方案2】:
DOIT=""
for f in file1.sh file2.sh; do
  if [ -x /home/$f ]; then DOIT="/home/$f"; break; fi
done
if [ -z "$DOIT" ]; then echo "Files not found, continuing build"; fi
if [ -n "$DOIT" ]; then $DOIT && echo "No Errors" || exit 1; fi

对于那些对我的语法感到困惑的人,请尝试运行:

true && echo "is true" || echo "is false"
false && echo "is true" || echo "is false"

【讨论】:

  • 你能解释一下这个脚本的作用吗?谢谢
  • @user1477324:第 1 行:初始化;第 2-4 行:确定您请求的文件是否存在(将使用找到的第一个文件)。第 5 行:如果您请求的文件不存在,请投诉。第 6 行:如果请求的文件确实存在,则执行它。如果没有错误,也打印“No Errors”。如果有错误也退出。
  • 对不起,我对 shell 脚本很陌生,你可以清楚地知道,但是如果有的话,这会打印错误吗?你能解释一下'initialize'和'2-4'行吗?这会在 home 中找到文件吗?
  • +1 - @user1477324:这和我写的没什么不同,虽然我想知道你真正需要的是一个make 文件。
  • @Dennis,不,我不需要制作文件。我只想能够找到任何一个文件(如果存在),执行它,如果有错误则退出,或者如果没有错误则继续。如果不存在,则无论如何它都应该继续。我希望我对你有意义
猜你喜欢
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 2021-11-15
相关资源
最近更新 更多