gpt4 book ai didi

linux - 为什么 if 表达式在 bash 脚本中总是为真

转载 作者:可可西里 更新时间:2023-11-01 11:48:24 25 4
gpt4 key购买 nike

我是 shell 脚本的新手,我编写了这段代码来将输入文件从目录 new1 复制到目录 new2,如果该文件不存在于第二个目录中。

问题是第一个 if 表达式总是为真,代码总是打印“文件复制成功”,即使文件存在于第二个目录中也是如此。

这是我的代码:

while true; do
echo "enter a file name from directory new1 to copy it to directory new2 "
echo "or enter ctrl+c to exit: "
read input
i=0
cd ~/new2
if [ -f ~/new1/$input ]; then
i=1
fi
if [ $i -eq 0 ];then
cp ~/new1/$input ~/new2/
echo "####" $input "copied successfully ####"
else
echo "#### this file exist ####"
fi
done

如果有人告诉我如何解决这个问题,我将不胜感激

最佳答案

您正在比较错误的文件。此外,您可能想要重构您的逻辑。无需保留单独的变量来记住您刚刚执行的操作。

while true; do
echo "enter a file name from directory new1 to copy it to directory new2 "
echo "or enter ctrl+c to exit: "
read input
#i=0 # no use
#cd ~/new2 # definitely no use
if [ -f ~/new2/"$input" ]; then # fix s/new1/new2/
# diagnostics to stderr; prefix messages with script's name
echo "$0: file ~/new2/$input already exists" >&2
else
cp ~/new1/"$input" ~/new2/
echo "$0: ~/new1/$input copied to ~/new2 successfully" >&2
fi
done

注意使您的诊断消息足够具体以便有用。太多初学者脚本告诉您“文件未找到”23 次,但您不知道您尝试访问的 50 个文件中的哪些文件未找到。同样,在诊断消息中包含生成诊断的脚本或工具的名称有助于识别罪魁祸首,并在您开始构建调用脚本的脚本时促进调试......

当您学习使用命令行时,您会发现需要交互式输入的脚本很难使用,因为它们不提供命令历史记录、文件名的制表符补全以及其他任何人都可以轻松获得的细节接受命令行文件参数的工具。

cp -u已经完成了此脚本试图实现的操作,因此脚本本身并不是特别有用。

另请注意,~ 是 Bash 独有的功能,它不适用于 sh。您的脚本在其他方面似乎与 POSIX sh 兼容,并且实际上可以从一些 Bash 扩展中受益,例如 [[ 如果您无论如何都要使用 Bash 功能。

关于linux - 为什么 if 表达式在 bash 脚本中总是为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48589384/

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