当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么带有反引号的if语句不能正常工作?》经验,为你挑选了2个好方法。

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

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

PSkocik.. 9

你想要的是什么

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

不要忘记引号.


你的版本:

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

将始终执行else分支.

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

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

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

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


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



1> PSkocik..:

你想要的是什么

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

不要忘记引号.


你的版本:

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

将始终执行else分支.

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

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

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

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


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



2> John Hascall..:

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

只需使用:

if cp ... ; then
    ...

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有