为什么如果表达式在bash脚本中始终为真

时间:2018-02-02 19:10:04

标签: linux bash

我是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

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

1 个答案:

答案 0 :(得分:5)

您正在比较错误的文件。此外,您可能想要重构您的逻辑。没有必要保留一个单独的变量来记住你刚刚做了什么。

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扩展中受益,例如[[