我在 shell 脚本中设置了一个函数,该函数检查文件夹是否存在,如果不存在,则尝试创建它,如果它不能创建文件夹(例如,如果用户没有正确的权限)返回 1 . 然后我检查了这个“return”,但是我不明白为什么“if”不起作用,因为return等于1。
代码:
#!/bin/bash
# Main folders
INPUT="input"
OUTPUT="output"
# Functions
function checkFolderExist(){
if [ -d $1 ]
then
# 0 = true
# Change to 0, only for tests.
return 1
else
mkdir $1
result=$?
if [ result==0 ]
then
# 0 = true
return 0
else
# 1 = false
return 1
fi
fi
}
CHECKINPUT=$(checkFolderExist $INPUT)
echo $?
CHECKOUTPUT=$(checkFolderExist $OUTPUT)
echo $?
# If folders does not exist, exit the script
if [[ "$CHECKINPUT" = 1 || "$CHECKOUTPUT" = 1 ]]; then
echo "[+] Error. Folder does not exist. Check user permissions."
exit 1
fi
这里有几件事。
$?
任何内容或将其保存在变量中(除非您需要多次引用相同的退出状态)。return
很少有显式返回值)。create_dir_if_needed
。[ result==0 ]
。字符串result==0
是一个非零长度的字符串,如果字符串的长度非零,用这种方式测试一个字符串会返回真,所以测试总是真。你可能想要[ "$result" -eq 0 ]
。考虑到这些事情:
这将返回 的退出状态
mkdir -p -- "$1"
。如果该目录尚不存在,此命令将创建命名目录(以及任何中间目录)。如果该mkdir
命令创建目录失败,它将以非零退出状态退出,这将成为函数的退出状态。mkdir -p
如果目录已经存在,则不会失败。你会用这个作为
或者,由于该功能微不足道,您可以摆脱它并说
create_dir_if_needed
该函数的一个变体mkdir
不使用-p
,因此永远不会为给定的目录路径创建缺少的父目录:或者,
如果目录已经存在或调用顺利,则调用此函数将返回真(零)。
mkdir
没有显式值的return
语句将返回最近执行的语句的退出状态,在这种情况下,它将返回[ -d "$1" ]
测试的积极结果。在返回值方面,Bash 不像常规编程语言那样工作。
在这里,您将checkFolderExist 的输出与 checkFolderExist 的返回状态混淆了。
您的 CHECKINPUT 和 CHECKOUTPUT 变量将为空,因为您的函数既没有
echo
也没有printf
任何东西。如果您真的想保存函数的返回状态以供以后使用,您应该这样做:
除此之外,无论如何,我还是建议您遵循Kusalananda 的回答中的建议,指导您使用更好的技术来解决问题。
您正在混淆函数的输出与返回值。我向您展示了最小的工作示例,因此您可以看到自己的错误:
要么做回报:
或写入标准输出并检查输出:
另请注意,我更喜欢将 integer 与 variable 的 string 区分开来
ret
,如果您知道输出只能是数字但使其更清晰,这并不是真正必要的。此外,如果条件语句紧随其后,则不需要将返回值捕获到变量中。这是你想要的第一个,所以你不能使用
$()
. 你真的把它们混在一起了:像第一个例子一样返回值,像第二个例子一样检查输出。