gpt4 book ai didi

用于检查未设置和空白变量的 Bash 函数

转载 作者:行者123 更新时间:2023-11-29 09:43:05 25 4
gpt4 key购买 nike

我正在编写一个 bash 函数来检查空白或未设置的变量。

function exit_if_var_does_not_exist {
TMP_NAME=$1
TMP_VALUE=`echo $TMP_NAME`
if [ -z ${TMP_VALUE+x} ]; then
echo "Variable [${TMP_NAME}] is unset. Exiting."
exit 1
else
if [ ${TMP_VALUE} = "" ]; then
echo "Variable [${TMP_NAME}] is set to ''. Exiting."
exit 1
fi
fi
echo "Variable [${TMP_NAME}] is set to ${TMP_VALUE}"
}

VAR=Test
exit_if_var_does_not_exist VAR
BLANK=
exit_if_var_does_not_exist BLANK

这没有给我 TMP_VALUE 中的预期输出。有人可以帮我解决我在这里缺少的东西吗?

-bash-3.2$ ./x.sh
Variable [VAR] is set to VAR
Variable [BLANK] is set to BLANK

最佳答案

空测试 block 的问题在于,在这段代码中,您根本无法真正获得最初命名变量的值。

当您使用 TMP_NAME=$1 时,您将输入变量的 name 分配给 TMP_NAME 然后

TMP_VALUE=`echo $TMP_NAME`

只是将该名称分配给 TMP_VALUE。实际上,您只是运行了 TMP_VALUE=$1

因此,您并未测试最初命名的变量是否在此处的任何位置包含内容。

为此,您需要使用 indirect expansion .

TMP_VALUE=${!TMP_NAME}TMP_VALUE=${!1}

旁注您在顶部的“未设置”测试 block 永远不会触发。

TMP_VALUE 不能永远被取消设置,因为您分配给它。甚至 TMP_VALUE= 也将变量标记为“set”。所以那个位是没用的。不过,感谢 David C. Rankin 花了足够长的时间让我想到这一点,您可以使用间接扩展技巧来完成这项工作。

[ -z "${!TMP_NAME+x}"] 将为 TMP_NAME 中命名的任何设置变量返回 true,为未设置的变量返回 false。

如果你想要做的是错误的,如果一个变量未设置或空白,那么所有这些都说了,shell 已经覆盖了你。只需使用

: "${VAR:?Error VAR is unset or blank.}" || exit 1

最后,正如 David C. Rankin 在 [ 中指出的那样,您需要引用扩展,当它们改变测试的含义时可能会消失(您在 -z 测试上面)以及这里。

所以 [ ${TMP_VALUE} = ""] 需要是 [ "${TMP_VALUE}"= ""] 因为 TMP_VALUE 为空第一个版本将成为语法错误,因为 [ = ""] 不是 test/[ 的有效调用。

关于用于检查未设置和空白变量的 Bash 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33750608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com