bash if 문으로 문자열을 평가합니다.

bash if 문으로 문자열을 평가합니다.

do_command()내 스크립트에는 명령을 인쇄한 다음 실행하는 기능이 있습니다 . 명령을 bash 문자열 배열에 넣은 다음 이 함수를 사용하여 print_execute하고 싶습니다. 그러나 if 문으로 이것을 시도하면 실패합니다. 스크립트는 다음과 같습니다.

#!/bin/bash

do_command () {
    echo "$@";
    $@;
}

comms=( "wget -O test http://speedtest.ftp.otenet.gr/files/test100k.db" # just a download test \
        "/bin/bash -c 'if [ -f test ]; then mv test test.old; fi'"      # replace previous test \
      );

for comm in "${comms[@]}"; do do_command "$comm"; done

저는 작은따옴표 + 큰따옴표의 다양한 조합을 시도해 보았고 if 문을 거기에 넣거나 매개변수로 넣었 /bin/bash지만 아직 이를 수행하는 방법을 찾지 못했습니다. 이 특정 조합을 사용하면 마지막 줄의 출력은 다음과 같습니다.

/bin/bash -c 'if [ -f test ]; then mv test test.old; fi'
[: -c: line 1: unexpected EOF while looking for matching `''
[: -c: line 2: syntax error: unexpected end of file

그러나 인쇄된 줄을 복사하여 프롬프트에 붙여 넣으면 오류 없이 실행됩니다.

파일/배열에서 if 문을 읽은 다음 스크립트에서 실행하는 방법이 있습니까?

답변1

그러면 토큰(따옴표가 없는 )이 , , , , ... /bin/bash -c 'if [ -f test ]; then mv test test.old; fi'인 인수가 생성되고 실행을 위해 Bash에 주어진 명령은 입니다 . 불균형한 견적이 있으므로 구문 오류가 발생합니다. (나머지 args는 실행된 명령의 위치 인수로 이동됩니다.)$@/bin/bash-c'if[-c'if

"$@"또한 스크립트에는 하나의 매개변수만 있으므로 따옴표 와 함께 작동하지 않으므로 모두 단일 문자열로 유지됩니다.

바라보다:변수에 저장된 명령을 어떻게 실행할 수 있나요?

이러한 명령을 저장하려면 다음을 사용하여 실행해야 합니다 eval.

execute() {
    printf "executing {{ %s }}\n" "$1"
    eval "$1"
}
cmds=("echo foo bar"
      "if true; then echo yes; fi"
      "foo=123; echo \"\$foo\""
      'echo "$(date)"'
      "echo \"what's \$foo now?\""
     )
for c in "${cmds[@]}"; do
    execute "$c"
done

복잡한 명령을 사용함에도 불구하고 여전히 일반적인 참조 지옥 문제가 발생할 수 있습니다.

명령을 함수에 넣고 이를 사용하여 set -x무슨 일이 일어나는지 인쇄하는 것을 고려할 수 있지만 출력은 달라집니다.

관련 정보