将退出代码读取到脚本中

将退出代码读取到脚本中

我创建此脚本是为了查找我需要测试的某些参数的退出代码。现在我需要创建第二个脚本来调用该脚本来检查退出代码。但是,第二个脚本需要从此脚本读取退出代码,然后为其分配文本。

例子:

传递/etc/resolve.conf然后使用echo $?返回0

现在我想要类似found file回声的东西。

这是第一个查找退出代码的脚本

#/bin/bash
shopt -s -o nounset

if [ $# != 1 ]; then
    exit 2
fi

if [[ ${1:0:1} = /* ]]; then
    :
else
    exit 3
fi

if [ -f ${1} ]; then
    exit 0
else
    exit 1
fi

这就是我的第二个脚本所处的位置。调用 ./script1.sh 后,我不明白如何将退出代码 0 设置为 = text。

#/bin/bash
shopt -s -o nounset
./script1.sh

我知道像这个例子一样在 script1 中包含 echo 会更容易,但在这种情况下它们需要从第二个文件中读取。

if [ -f ${1} ]; then
    echo "file found"
    exit 0
else
    echo "file not found"
    exit 1
fi

答案1

您拨打的电话script1.sh是:

./script1.sh

调用后,脚本的退出代码将位于$?.

但是,您在没有任何参数的情况下调用脚本,并且脚本的头部对参数数量进行了以下测试,并以错误代码 2 退出,除非恰好有 1 个。这与您在评论中提到的行为相符。

if [ $# != 1 ]; then
    exit 2
fi

您可能想打电话script1.sh提出一些争论。如果您想传递主脚本收到的参数,请使用

./script1.sh "$@"   # pass all arguments

或者

./script1.sh "$1"   # pass the first argument

(尽管即使没有为主脚本提供参数,后者也会传递一个空字符串。)


作为次要问题,您应该引用变量扩展,即"$#"用 代替 $#"${1}""$1"用 代替${1}。否则,脚本将因文件名包含空格而失败,甚至如果在脚本启​​动时将 设置为某个疯狂的值,也$#可能会出错。IFS

另外,代替

if something; then
    :
else
    exit 3
fi

你可以写

if ! something; then
    exit 3
fi

答案2

假设这是您的第二个脚本:

#/bin/bash
shopt -s -o nounset
./script1.sh
result=$?
echo $result

我将其分配给变量的原因是我存储以供将来处理 - 如果您调用另一个程序$?将与另一个程序相关

$?就是之前的脚本返回的内容

相关内容