非常杂乱的方式来随机设置一个变量,并取消其余部分?

时间:2016-04-18 06:27:05

标签: bash variables random

假设我在Bash中有5个变量:

foo
bar
goo
var
dog

我想随机选择其中一个变量,将其设置为“1”,并将其余变量设置为空,或者取消0,无论哪个。

我绝对可以想到用shuf这样做的方法,但它会非常不优雅,我希望用超过5个变量做到这一点。我想看看你们的人怎么想,这不会像我想象的那样一团糟。

3 个答案:

答案 0 :(得分:3)

这是一种方法。它可能和你的一样,因为你已经把它留给自己了。我使用数组和可怕的 ( SELECT Behavior FROM [Interaction Behaviors] JOIN Behaviors ON [Interaction Behaviors].BehaviorID = Behaviors.BehaviorID JOIN Interactions ON Interactions.InteractionID = [Interaction Behaviors].InteractionID WHERE [Interaction Behaviors].InteractionID = Interactions.InteractionID AND Behaviors.BehaviorID = 5 ) 。请注意,如果您设置来自外部来源的值,则eval可能存在安全风险。

eval
编辑,可能更简单:

foo='Foo'
bar='Bar'
goo='Goo'
var='Var'
dog='Dog'

tmp=(foo bar goo var dog)

idx=$(( $RANDOM  % ${#tmp[@]} ))
count=0
for ele in "${tmp[@]}"
do
    if (( count == idx ))
    then
        eval "$ele=1"
    else 
        eval "$ele=0"
    fi
    (( count++ ))
done

echo "$foo, $bar, $goo, $var, $dog"

编辑:可能最简单(奖励无评估)来自@ 123:

#!/bin/bash
foo='Foo'
bar='Bar'
goo='Goo'
var='Var'
dog='Dog'

tmp=(foo bar goo var dog)

idx=$(( $RANDOM  % ${#tmp[@]} ))
for (( ele=0; ele < ${#tmp[@]}; ele++ ))
do
    if (( ele == idx ))
    then
        eval "${tmp[$ele]}=1"
    else 
        eval "${tmp[$ele]}=0"
    fi
done

echo "$foo, $bar, $goo, $var, $dog"

tmp=(foo bar goo var dog) idx=$(( $RANDOM % ${#tmp[@]} )) count=0 for ele in "${tmp[@]}" do (( $ele = count++ == idx)) done echo "$foo, $bar, $goo, $var, $dog" 需要解释。通常情况下,我们不会在作业的左侧提供$ele = count++ == idx,但在这种情况下($),替换会尽早完成,并为我们提供所需的效果。 $ele =在相等时返回1,在向左失败时返回0(与shell中的条件相反)。 count == idx postfix 运算符,在语句的其余部分后递增

答案 1 :(得分:2)

使用bash内置变量$RANDOM

的简单示例
#!/bin/bash

foo='Foo'
bar='Bar'
goo='Goo'
var='Var'
dog='Dog'

declare -a RANDOM_ARRAY=( foo bar goo var dog )

for ((i=0; i<${#RANDOM_ARRAY[@]}; i++));
do
    eval "${RANDOM_ARRAY[$i]}=0"
done

echo -e "$foo $bar $goo $var $dog"

# Using bash built-in'$RANDOM' variable to randomize the element
# between 0 and 32767

RANDOM_ELEMENT=$[ $RANDOM % 5]
eval "${RANDOM_ARRAY[$RANDOM_ELEMENT]}=1"

# Optional to print this

echo -e "$foo $bar $goo $var $dog"

进行多次试验以观察随机化。

答案 2 :(得分:2)

我会尝试这样的事情:

myvars=(var_a var_b var_c)
index=$(($RANDOM % ${#myvars[@]}))

for var in "${myvars[@]}"
  do if [[ "${var}" == "${myvars[$index]}" ]]
        then eval "${var}=1"
        else eval "${var}=0"
  fi
  echo ${var}=${!var}
done