#想通过if..fi脚本创建文件。先判断创建的文件名,在系统内是否存在。判断输入的文件名是否为空。利用返回值return(0 1)进行判断。如果输入的文件名重复或者输入为空,就提示”输入内容为空或文件名村子“,如果输入正常,就提示输入的文件已经创建#。下面脚本中,如果输入为重复或为空,就有提示,但是创建正常文件也就是返回值return为0,没有任何输出信息,也不创建。如果把下面的判断式中elif换成else,就正常输出,并创建文件,不知道为什么?$?无法判断返回值0么?为什么?
```bash
#!/bin/bash
CH(){
read -p "请输入文件名:" FILENAME
if [ -e "${FILENAME}" ];then
return 1
elif [ -z "${FILENAME}" ];then
return 1
else
return 0
fi
}
CH
if [ "$?" == "1" ];then
echo -e "\e[33m您输入的文件名存在或输入为空,请重新输入!\e[0m"
elif [ "$?" == "0" ];then
echo -e "\e[33m您输入的文件名${FILENAME}已经创建!\e[0m"
touch /mnt/${FILENAME}
fi
```
$?它只是代表上一条命令执行的结果,如果没错就返回0,如果有错就返回错误代码是2,你这里的if一执行,应该就会覆盖之前的值了。因此elif始终不满足。修改后的代码:
#!/bin/bash
CH(){
read -p "请输入文件名:" FILENAME
if [ -e "${FILENAME}" ];then
return 1
elif [ -z "${FILENAME}" ];then
return 1
else
return 0
fi
}
CH
result=$?
if [ "$result" == "1" ];then
echo -e "\e[33m您输入的文件名存在或输入为空,请重新输入!\e[0m"
elif [ "$result" == "0" ];then
echo -e "\e[33m您输入的文件名${FILENAME}已经创建!\e[0m"
touch /mnt/${FILENAME}
fi
有帮助的话,请点采纳~
判断语句中多次调用了if [ "$?" == "1" ],每次调用都会导致之前的返回值被覆盖,所以第二次调用的时候返回值为0,无法判断。
我修改了一下,你参考一下:
#!/bin/bash
CH(){
read -p "请输入文件名:" FILENAME
if [ -e "${FILENAME}" ];then
RET=1
elif [ -z "${FILENAME}" ];then
RET=1
else
RET=0
fi
}
CH
if [ "$RET" == "1" ];then
echo -e "\e[33m您输入的文件名存在或输入为空,请重新输入!\e[0m"
elif [ "$RET" == "0" ];then
echo -e "\e[33m您输入的文件名${FILENAME}已经创建!\e[0m"
touch /mnt/${FILENAME}
fi
该回答引用ChatGPT
在你的脚本中,你调用了一个函数CH()来检查文件名是否存在或为空。如果文件名存在或为空,该函数将返回1,否则返回0。然后在函数调用后检查函数的返回值来决定下一步的操作。
然而,在你的脚本中,你两次检查函数的返回值。第一次是在if语句中,它检查函数的返回值是否为1。如果函数的返回值是1,则打印“您输入的文件名存在或输入为空,请重新输入!”的错误消息。这部分代码是可以正常工作的。
但是,在第二个if语句中,你再次检查了函数的返回值。这个if语句与上面的if语句没有关系,它只是检查函数的返回值是否为0。如果函数的返回值是0,它会打印“您输入的文件名${FILENAME}已经创建!”的消息,并创建一个新的文件。然而,由于你在函数调用之后两次检查函数的返回值,所以第二个if语句中的条件永远不会满足。因此,如果你使用elif语句,它永远不会执行其中的代码块。
你可以通过将if语句和创建文件的代码放在同一行中来解决这个问题,这样就不需要检查函数的返回值两次。例如,你可以这样写:
if CH; then echo -e "\e[33m您输入的文件名${FILENAME}已经创建!\e[0m" && touch /mnt/${FILENAME}; else echo -e "\e[33m您输入的文件名存在或输入为空,请重新输入!\e[0m"; fi
这行代码会首先调用CH()函数并检查它的返回值。如果返回值是0,则打印“您输入的文件名${FILENAME}已经创建!”的消息,并创建一个新的文件。否则,它会打印“您输入的文件名存在或输入为空,请重新输入!”的消息。
修正后代码
#!/bin/bash
CH() {
read -p "请输入文件名:" FILENAME
if [ -z "${FILENAME}" ]; then
echo -e "\e[33m输入内容为空或文件名不存在!\e[0m"
return 1
elif [ -e "${FILENAME}" ]; then
echo -e "\e[33m输入内容为空或文件名已存在!\e[0m"
return 1
else
echo -e "\e[33m输入的文件名${FILENAME}已经创建!\e[0m"
touch /mnt/"${FILENAME}"
return 0
fi
}
if CH; then
echo -e "\e[33m文件创建成功!\e[0m"
else
echo -e "\e[33m文件创建失败!\e[0m"
fi
暂存一下喽
参考GPT和自己的思路,您的脚本逻辑是有一定问题的,原因是您在判断条件后使用了函数返回值来进行判断,但是当您使用"$?"来获取函数返回值时,您已经执行完该函数并将其返回值保存到了"$?"中,而此时"$?"的值已经被if语句的条件判断所使用,因此在后续if语句中再次使用"$?"获取函数返回值就无法得到正确的结果。
为了解决这个问题,您可以将函数返回值存储到一个变量中,然后在后续的if语句中使用该变量进行判断。以下是修改后的代码:
#!/bin/bash
CH() {
read -p "请输入文件名:" FILENAME
if [ -e "${FILENAME}" ]; then
return 1
elif [ -z "${FILENAME}" ]; then
return 1
else
return 0
fi
}
RET=$(CH)
if [ "$RET" == "1" ]; then
echo -e "\e[33m您输入的文件名存在或输入为空,请重新输入!\e[0m"
else
echo -e "\e[33m您输入的文件名${FILENAME}已经创建!\e[0m"
touch /mnt/${FILENAME}
fi
在上面的修改中,我们将CH函数的返回值存储到了变量"$RET"中,然后在后续的if语句中使用该变量进行判断。这样就可以避免"$?"被if语句条件判断所占用的问题。
希望这能够帮助到您!