我试图做一个bash脚本,其中用户将能够复制一个文件,看它是否已成功完成与否。但是,每次复制完成后,都会显示第二个输出“复制未完成”。任何想法如何解决这个问题?为什么我的if语句反引号不能正常工作?
if [ `cp -i $files $destination` ];then
echo "Copy successful."
else
echo "Copy was not done"
fi
我试图做一个bash脚本,其中用户将能够复制一个文件,看它是否已成功完成与否。但是,每次复制完成后,都会显示第二个输出“复制未完成”。任何想法如何解决这个问题?为什么我的if语句反引号不能正常工作?
if [ `cp -i $files $destination` ];then
echo "Copy successful."
else
echo "Copy was not done"
fi
你需要的是
if cp -i "$file" "$destination"; then #...
您版本:
if [ `cp -i $files $destination` ];then #..
总会执行else
分支。
的如果语句在shell接受命令。 如果命令成功(返回0
,其被分配到$?
),则条件成功。
如果你这样做if [ ... ]; then
,那么它一样 if test ... ; then
因为[ ]
对于test命令/内置的语法糖。
在你的情况,你传递的标准输出*的cp
操作参数的到test
的标准输出的结果cp
操作将是空的(cp
一般只输出错误和那些去stderr)。用空参数列表调用test
是一个错误。该错误导致非零退出状态,因此您始终可以获得else
分支。
*的$()
进程替换或反引号进程替换发出声音命令的标准输出他们运行
使用back ticks测试cp命令的输出,而不是其状态。这里也不需要测试命令(方括号)。
只需使用:
if cp ... ; then
...
除了测试输出经文状态在对方的回答是正确地指出,你可以使用一个复合命令做什么你正在尝试,而不需要完整的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'
注:确保始终引用您的变量,以防止字分裂和路径扩展等..
尝试:
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
'if cp -i“$ file”“destination”;然后#...' – PSkocik
只是为了完整性'X &&ÿ|| Z'实际上并不是壳中的三元运算符。即使“X”成功(如果“Y”失败),“Z”也可以运行。 –