假设我在Bash中有5个变量:
foo
bar
goo
var
dog
我想随机选择其中一个变量,将其设置为“1”,并将其余变量设置为空,或者取消0,无论哪个。
我绝对可以想到用shuf这样做的方法,但它会非常不优雅,我希望用超过5个变量做到这一点。我想看看你们的人怎么想,这不会像我想象的那样一团糟。
答案 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