如何将命令存储为变量并在 bash 中随机执行它们?

如何将命令存储为变量并在 bash 中随机执行它们?

如何将命令存储为变量并在 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[@]}"))

所需的输出是随机运行两个转换命令中的任何一个。我怎样才能得到想要的结果以及哪里出了问题?

我从以下方面得到了暗示——

执行随机命令

如何在 shell 脚本中的变量中存储命令

预先感谢您的帮助!

答案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...

相关内容