쉘 스크립트에서 따옴표 없이 매개변수를 전달하는 방법은 무엇입니까?

쉘 스크립트에서 따옴표 없이 매개변수를 전달하는 방법은 무엇입니까?

나는 bash 스크립트가 셸 실행 파일을 호출하고 이를 위해 따옴표를 사용하는 자체 명령 셸을 만들어야 했습니다. 문제는 논리 연산자를 사용하여 이 작업을 수행하려고 하면 따옴표가 특수 문자를 닫는 것처럼 보인다는 것입니다 &&. 예를 들어:

var=("echo hello && mkdir testing")
./rshell ${var}

hello && mkdir testing실제로 연산자의 논리를 따르는 대신 명령 셸의 최종 출력은 hello를 성공적으로 출력한 다음 디렉터리 테스트를 수행합니다. 이 문제를 어떻게 해결할 수 있나요?

답변1

이건 확실히 처럼 보이는데XY 문제. 최종 목표가 무엇인지 아는 것이 도움이 되지만,

  • 귀하의 변수 var는 실제로대량으로var=( ... )문법 때문에
    • 괄호 안의 모든 내용을 인용했기 때문에 모든 데이터를 단일 요소에 추가했습니다.
    • array()를 호출하기 위해 올바른 구문을 사용하지 않고 있습니다 ${var[@]}. 이 경우 모든 것이 단일 요소에 있기 때문에 이는 큰 문제가 아닙니다.

가장 큰 문제는 논리적 AND가 참조되고 해석되는 방식인 것 같습니다. 배열에 추가할 때 따옴표를 붙이지 않으면 쉘은 이를 평가하려고 시도하고, 인용하면 여전히 리터럴 문자열이므로 평가가 불가능합니다. 이 문제를 (사용하지 않고) 해결할 수 있었던 방법 중 하나는 eval다음을 사용하는 것이었습니다.

스크립트 파일

#!/bin/bash

bash -c "$(echo $@)"

$ tree
.
└── script.sh

0 directories, 1 file
$ cmd=(echo hello \&\& mkdir test)
$ ./script.sh "${cmd[@]}"
hello
$ tree
.
├── script.sh
└── test

1 directory, 1 file

관련 정보