2016-01-06 41 views
1

我试图做一个bash脚本,其中用户将能够复制一个文件,看它是否已成功完成与否。但是,每次复制完成后,都会显示第二个输出“复制未完成”。任何想法如何解决这个问题?为什么我的if语句反引号不能正常工作?

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

回答

7

你需要的是

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

Don't forget the quotes.


您版本:

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

总会执行else分支。

如果语句在shell接受命令。 如果命令成功(返回0,其被分配到$?),则条件成功。

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

在你的情况,你传递的标准输出*的cp操作参数的test

标准输出的结果cp操作将是空的(cp一般只输出错误和那些去stderr)。用空参数列表调用test是一个错误。该错误导致非零退出状态,因此您始终可以获得else分支。


*的$()进程替换或反引号进程替换发出声音命令的标准输出他们运行

4

使用back ticks测试cp命令的输出,而不是其状态。这里也不需要测试命令(方括号)。

只需使用:

if cp ... ; then 
    ... 
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 || 'next cmd if 1st failed'command。一起很简单:

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

注:确保始终引用您的变量,以防止字分裂路径扩展等..

+1

只是为了完整性'X &&ÿ|| Z'实际上并不是壳中的三元运算符。即使“X”成功(如果“Y”失败),“Z”也可以运行。 –

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 
+2

'if cp -i“$ file”“destination”;然后#...' – PSkocik

相关问题