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

Tom*_*end 2 bash if-statement backticks

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

if [ `cp -i $files $destination` ];then
        echo "Copy successful."
else
        echo "Copy was not done"
fi
Run Code Online (Sandbox Code Playgroud)

PSk*_*cik 9

你想要的是什么

if cp -i "$file" "$destination"; then #...
Run Code Online (Sandbox Code Playgroud)

不要忘记引号.


你的版本:

if [ `cp -i $files $destination` ];then #..
Run Code Online (Sandbox Code Playgroud)

将始终执行else分支.

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

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

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

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


*$()进程替换或反引号进程替换会破坏它们运行的​​命令的标准输出


Joh*_*all 5

使用后退标记,您将测试cp命令的输出,而不是其状态.您也不需要测试命令(方括号).

只需使用:

if cp ... ; then
    ...
Run Code Online (Sandbox Code Playgroud)