如何在shell脚本中为布尔变量编写if if?

时间:2019-05-11 16:45:36

标签: bash shell

我正在尝试编写一个简单的外壳脚本来隐藏/显示我的桌面图标,但是在尝试运行它时出现错误“ hidedesktopicons.sh:第1行:[[gsettings:找不到命令”?

我搜索了如何在shell脚本中使用if语句。我加了“ fi”

enter code here

cat hidedesktopicons.sh 
if [[gsettings get org.mate.background show-desktop-icons = true]]
then gsettings set org.mate.background show-desktop-icons false
else gsettings set org.mate.background show-desktop-icons true
fi

我希望图标可以隐藏/取消隐藏。我收到错误消息“ hidedesktopicons.sh:第1行:[[gsettings:找不到命令”

2 个答案:

答案 0 :(得分:0)

直接的问题是,[[之后需要空格:

if [[ gsettings ...

下一个问题是您需要使用命令替换来捕获gsettings的输出,以便可以将其与true进行比较:

if [[ $(gsettings get org.mate.background show-desktop-icons) = true ]]
then gsettings set org.mate.background show-desktop-icons false
else gsettings set org.mate.background show-desktop-icons true
fi

您可能想要定义一对函数以减少此代码的某些重复性:

get_icon_status () {
  gsettings get org.mate.background show-desktop-icons
}

set_icon_status () {
  gsettings set org.mate.background show-desktop-icons "$1"
}

if [[ $(get_icon_status) = true ]]; then
  set_icon_status false
else
  set_icon_status true
fi

答案 1 :(得分:0)

与常见的编程语言相比,Bash确实没有truefalse的关键字。因此,如果程序在终端中返回字符串值“ true”,它将仅将其视为与“ foo”或“ bar”具有相同性质的字符串。bash中的if语句不评估什么由命令返回,它将评估命令的返回码。

if list1; then list2; else list3; fi

应读取为:如果执行了list1并且返回码为0,它将执行list2,否则执行list3

为充分演示,我使用以下令人困惑的命令:

$ if echo true; then echo yes; else echo no; fi
true
yes
$ if echo false; then echo yes; else echo no; fi
false
yes

如您所见,echo true返回值trueecho false返回值false,但两者都返回yes,这仅表明{{1} }命令成功执行。如果我们知道使用二进制文件echotrue

false

if语句中使用的常见命令之一是$ which true; true; echo $? /usr/bin/true 0 $ if true; then echo yes; else echo no; fi yes $ which false; false; echo $? /usr/bin/false 1 $ if false; then echo yes; else echo no; fi no 命令,通常写为test或bash复合命令[ EXPRESSION ],如果if语句,则返回码均为0 [[ EXPRESSION ]]的计算结果为true,如果EXPRESSION为false,则计算结果为1。这些命令可用于执行OP给出的字符串评估。

EXPRESSION