Bash:变量的奇怪行为包含

时间:2015-06-29 08:58:18

标签: linux bash variables dbus

我正在使用一个简单的bash函数来执行dbus命令并检索其结果。

getValue()
{
 local -i val   
 declare -a array

 array=($(dbus-send --system --print-reply ...))
 val=${array[7]}
 echo $val
 unset array

 if [ ! -z ${val} ]
 then   
  ...
 fi
}

当dbus命令返回预期值时,该功能正常工作。但是,当dbus处于不良状态时:

Error org.freedesktop.DBus.Error.NoReply: Did not receive a reply. Possible causes include: ...

“echo $ val”返回0,条件是[! -z“$ val”]满意。如何避免这种错误的状态?

2 个答案:

答案 0 :(得分:1)

假设当产生错误时,dbus的退出状态为非零(失败),您可以添加另一个检查:

array=($(dbus-send --system --print-reply ...))
val=${array[7]}
if [ $? -eq 0 ] && [ -n "$val" ]

$?包含要执行的最后一个命令的返回码(在本例中为dbus),通常0表示成功。我将您的条件更改为-n以检查非空和引用$val,因为它通常被认为是良好做法。您使用的花括号不提供任何防止全局扩展的保护,例如如果$val包含*

答案 1 :(得分:0)

您可以重定向命令的标准错误以加入标准输出,例如,

def replace(source, indexA, indexB):
    newList = source[:indexA[0]] + source[indexB[0]:indexB[1]]
    newList += source[indexA[1]:indexB[0]] + source[indexA[0]:indexA[1]]
    newList += source[indexB[1]:]
    return newList

myList = replace(myList, [2,4], [7,10])