微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – 为什么在bash脚本中表达式始终为true

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

问题是第一个if表达式始终为true,并且代码始终打印“文件已成功复制”,即使该文件存在于第二个目录中也是如此.

这是我的代码

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功能.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐