명령을 변수로 저장하고 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[@]}"))

원하는 출력은 두 변환 명령 중 하나를 무작위로 실행하는 것입니다. 원하는 결과를 얻으려면 어떻게 해야 하며, 무엇이 잘못되었나요?

다음에서 힌트를 얻었습니다.

무작위 명령 실행

쉘 스크립트의 변수에 명령을 저장하는 방법

도움을 주셔서 미리 감사드립니다!

답변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그런 다음 and 라는 이름의 함수 또는 배열이 있다고 가정 하고 cmd2거기에서 했던 것처럼 하나를 선택하고 함수를 사용하는 경우 실행하십시오.

commands=(cmd1 cmd2)
chosen=$(shuf -n1 -e "${commands[@]}")
"$chosen" args...

또는 배열을 사용하는 경우 이름 참조를 사용하여 배열에 액세스해야 합니다.

commands=(cmd1 cmd2)
declare -n chosen=$(shuf -n1 -e "${commands[@]}")
"${chosen[@]}" args...

관련 정보