명령을 변수로 저장하고 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}
부분이아니요선두. 따옴표는 따옴표 안에 아무런 영향을 미치지 않습니다. 즉, 매개변수에서 확장된 따옴표는 리터럴이므로 다시 인용되지 않습니다.
바라보다:
- 변수에 저장된 명령을 어떻게 실행할 수 있나요?
- BashFAQ 050 - "명령을 변수에 넣으려고 하는데 복잡한 경우에는 항상 실패합니다!"
- 공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?
두 가지 더 나은 옵션은 명령을 별도의 함수나 별도의 배열에 저장하는 것입니다. 불행히도 이름을 지정해야 하며 (번호가 매겨진) 함수의 배열이나 배열의 배열을 가질 수 없습니다.
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...