我正在尝试制作一个Bash脚本,用户可以在其中复制文件,看看是否成功完成。但是每次复制完成,无论是否正确,都会显示第二个输出“未完成复制”。知道如何解决这个问题吗?
if [ `cp -i $files $destination` ];then
echo "Copy successful."
else
echo "Copy was not done"
fi
答案 0 :(得分:9)
你想要的是
if cp -i "$file" "$destination"; then #...
你的版本:
if [ `cp -i $files $destination` ];then #..
将始终执行else
分支。
shell中的 if 语句接受命令。
如果该命令成功(返回0
,并将其分配到$?
),则条件成功。
如果你if [ ... ]; then
,那么它就像if test ... ; then
一样
[ ]
因为cp
是test命令/内置的语法糖。
在您的情况下,您将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