为什么带有反引号的if语句不能正常工作?

时间:2016-01-06 02:07:02

标签: bash if-statement backticks

我正在尝试制作一个Bash脚本,用户可以在其中复制文件,看看是否成功完成。但是每次复制完成,无论是否正确,都会显示第二个输出“未完成复制”。知道如何解决这个问题吗?

if [ `cp -i $files $destination` ];then
        echo "Copy successful."
else
        echo "Copy was not done"
fi

4 个答案:

答案 0 :(得分:9)

你想要的是

if cp -i "$file" "$destination"; then #...

Don't forget the quotes.

你的版本:

if [ `cp -i $files $destination` ];then #..

将始终执行else分支。

shell中的 if 语句接受命令。 如果该命令成功(返回0,并将其分配到$?),则条件成功。

如果你if [ ... ]; then,那么它就像if test ... ; then一样 [ ]因为cptest命令/内置的语法糖。

在您的情况下,您将test操作的 stdout * 的结果作为参数传递给cp

cp操作的标准输出将为空(test通常只会输出错误,而这些操作会转到 stderr )。具有空参数列表的else调用是错误的。该错误导致非零退出状态,因此您始终获得$()分支。

* {{1}}进程替换或反引号进程替换淹没了他们运行的命令的 stdout

答案 1 :(得分:5)

使用后退滴答,您正在测试cp命令的输出,而不是其状态。您也不需要测试命令(方括号)。

只需使用:

if cp ... ; then
    ...

答案 2 :(得分:1)

除了在另一个答案中正确指出输出经文状态之外,您还可以使用复合命令来完全按照您的尝试进行操作,而不需要完整的if ... then ... else ... fi语法。例如:

cp -i "$files" "$destination" && echo "Copy successful." || echo "Copy was not done"

基本上与if语法完全相同。基本上是:

command && 'next cmd if 1st succeeded'

command || 'next cmd if 1st failed'

您只是将command && 'next cmd if 1st succeeded'用作command中的command || 'next cmd if 1st failed'。简而言之:

command && 'next cmd if 1st succeeded' || 'next cmd if 1st failed'

注意:请务必始终引用您的变量以防止分词路径名扩展等...

答案 3 :(得分:0)

尝试:

                cp -i $files $destination
                #check return value $? if cp command was successful
                if [ "$?" == "0" ];then
                        echo "Copy successful."

                else
                        echo "Copy was not done"
                fi