如何将命令存储为变量并在 bash 中随机执行它们?
command1="
convert -size 2000x1000 xc:none -gravity center \
-stroke yellow -pointsize 50 -font Courier-BoldOblique -strokewidth 3 -annotate +100+100 "${caption}" \
-blur 0x25 -level 0%,50% \
-fill white -stroke none -annotate +100+100 "${caption}" \
in.jpeg +swap -gravity center -geometry +0-3 \
-composite out.jpeg
"
command2="
convert -size 2000x1000 xc:none -gravity center \
-fill white -pointsize 50 -stroke none -annotate +100+100 "${caption}" -channel alpha -evaluate multiply 0.35 -trim +repage \
in.jpeg +swap -gravity center -geometry +0-3 \
-composite out.jpeg
"
我尝试过什么
COMMANDS=("command1" "command2")
$(eval $(shuf -n1 -e "${COMMANDS[@]}"))
所需的输出是随机运行两个转换命令中的任何一个。我怎样才能得到想要的结果以及哪里出了问题?
我从以下方面得到了暗示——
预先感谢您的帮助!
答案1
使用一个函数。
command1(){
convert -size 2000x1000 xc:none -gravity center \
-stroke yellow -pointsize 50 -font Courier-BoldOblique -strokewidth 3 -annotate +100+100 "${caption}" \
-blur 0x25 -level 0%,50% \
-fill white -stroke none -annotate +100+100 "${caption}" \
in.jpeg +swap -gravity center -geometry +0-3 \
-composite out.jpeg
}
command2() {
convert -size 2000x1000 xc:none -gravity center \
-fill white -pointsize 50 -stroke none -annotate +100+100 "${caption}" -channel alpha -evaluate multiply 0.35 -trim +repage \
in.jpeg +swap -gravity center -geometry +0-3 \
-composite out.jpeg
}
看看为什么为什么变量在尝试运行命令时失败
答案2
首先,当参数中有空格或文字全局字符时,这将不起作用:
command1="convert ... -fill white -stroke none -annotate +100+100 "${caption}" ...
请注意,即使语法突出显示也表明${caption}
部分是不是引。引号在引号内不起作用,即从参数扩展的引号是文字,它们不会再次引用。
看:
两个更好的选择是将命令存储在单独的函数或单独的数组中。遗憾的是,您必须为它们提供名称,您不能拥有(编号的)函数数组或数组数组。
然后,假设您有名为cmd1
和 的函数或数组cmd2
,请像您在那里那样选择一个,如果您使用函数,只需运行它:
commands=(cmd1 cmd2)
chosen=$(shuf -n1 -e "${commands[@]}")
"$chosen" args...
或者,如果您使用数组,则必须使用名称引用来访问它:
commands=(cmd1 cmd2)
declare -n chosen=$(shuf -n1 -e "${commands[@]}")
"${chosen[@]}" args...