2013-02-05 57 views
1

将字符串(例如“True”)转换为合适的bash布尔变量的最佳方式是什么?例如Java有java.lang.Boolean.valueOf(字符串)BASH将字符串转换为布尔变量

现在,我在击使用此:

if [ "${answers[2]}" = "TRUE" ] ; then 
    clean=true; 
else 
    clean=false; 
fi 

是有办法做到这一点,避免IF语句?

编辑:澄清其不是由选择,我有字符串变量包含“真”,而不是只使用布尔变量。 为完整上下文这是代码

ans=$(yad --title='YadExample' --form --field=Opt1:CHK FALSE --field=Opt2:CHK FALSE --field=Opt3:CHK TRUE); 
#at this point the "yad" program is returning a string seperated by '|', e.g "TRUE|FALSE|TRUE" 
IFS="|" 
set -- $ans 
answers=([email protected]) 
unset IFS 
if [ "${answers[0]}" = "TRUE" ] ; then clean=true; else clean=false; fi 
if [ "${answers[1]}" = "TRUE" ] ; then var2=true; else var2=false; fi 
if [ "${answers[2]}" = "TRUE" ] ; then var3=true; else var3=false; fi 
+0

'answers'数组来自哪里?什么是可能的输入值? – andrewdotn

+0

我给这个问题增加了更多的上下文来解释我如何得到If语句 – bluphoenix

回答

2

你可以写一个函数来执行转换为你:

function boolean() { 
    case $1 in 
    TRUE) echo true ;; 
    FALSE) echo false ;; 
    *) echo "Err: Unknown boolean value \"$1\"" 1>&2; exit 1 ;; 
    esac 
} 

answers=(TRUE FALSE TRUE) 
clean="$(boolean "${answers[0]}")" 
var2="$(boolean "${answers[1]}")" 
var3="$(boolean "${answers[2]}")" 

echo $clean $var2 $var3 

打印

true false true 

或者,一点点发烧友:

function setBoolean() { 
    local v 
    if (($# != 2)); then 
    echo "Err: setBoolean usage" 1>&2; exit 1 ; 
    fi 

    case "$2" in 
    TRUE) v=true ;; 
    FALSE) v=false ;; 
    *) echo "Err: Unknown boolean value \"$2\"" 1>&2; exit 1 ;; 
    esac 

    eval $1=$v 
} 

answers=(TRUE FALSE TRUE) 

setBoolean clean "${answers[0]}" 
setBoolean var2 "${answers[1]}" 
setBoolean var3 "${answers[2]}" 

echo $clean $var2 $var3 
+0

很好。这几乎是我正在寻找的。我想避免使用if语句来代替我可能需要做很多事情的代码。这个函数是一个很好的抽象。不知道你可以从函数中设置变量,谢谢! – bluphoenix

+0

在这种情况下,我会使用'declare'而不是'eval'。它更安全(你不能从'$ 1'执行任意代码),并且你已经使用'bash'特有的功能。 – chepner

+0

@chepner当我将'eval $ 1 = $ v'更改为'声明$ 1 = $ v'时,脚本停止工作:/我认为这是因为它在函数内部使用,但我不完全确定。 – andrewdotn

-1

[是一个命令。

[ "${answers[2]}" = "TRUE" ] 
clean=$? 
0

你可以使用类似:

[ "${answers[2]}" != "TRUE" ] ; clean=$? 

你需要,如果你想clean设置为1的条件是true,则反转比较的意义。然后

您的序列变为:

[ "${answers[0]}" != "TRUE" ] ; clean=$? 
[ "${answers[1]}" != "TRUE" ] ; var2=$? 
[ "${answers[2]}" != "TRUE" ] ; var3=$?