파일에 저장하지 않고 콘솔 세션에서 쉘 스크립트 실행

파일에 저장하지 않고 콘솔 세션에서 쉘 스크립트 실행

Linux의 쉘 스크립트에 관해 질문이 있습니다. 나는 이것을 실행하려고합니다 :

$ sh << EOF
#!/bin/sh

function test {
echo test
echo test2
}

test


EOF

결과 :

test
test2

하지만 파일에 저장하지 않고 매개변수를 사용하여 스크립트를 실행하려면 어떻게 해야 합니까?

$ sh  $1 test1 test2 << EOF
#!/bin/sh

function test {
echo $2
echo $3
}

test

EOF

어떻게 해야 하나요?

답변1

쉘에 대한 옵션을 사용하여 쉘을 시작하면 쉘은 표준 입력에서 스크립트를 읽고 실행합니다 -s. 이렇게 하면 첫 번째 옵션이 스크립트 파일의 이름이라고 믿지 않게 됩니다.

따라서 bash -s "$1" test1 test2.

스크립트(또는 스크립트 내에서 호출되는 유틸리티)가 표준 입력 스트림에서 읽는 경우 스크립트 자체를 소비합니다. 따라서 표준 입력 스트림이 필요한 스크립트에는 적합하지 않습니다. 또한 비표준 키워드를 사용하여 함수를 만드는 데 필요 bash합니다 .shfunction

함수( 내장 명령 이름 mytest으로 이름 변경)가 호출 시 함수에 전달되어야 하는 스크립트의 두 번째 및 세 번째 명령줄 인수를 출력해야 한다고 가정해 보겠습니다.test

통과하면 이렇게 할 수 있습니다.모두함수 매개변수 사용법

mytest "$@"

...또는 필요한 두 가지를 전달할 수도 있습니다. "$1"대신 함수를 "$2"출력 으로 변경할 수도 있습니다.그것은두 개의 첫 번째 매개변수):

mytest "$2" "$3"

$1또한 명령줄과 $2스크립트 자체 $3내에서 모든 확장을 참조해야 합니다 . 바라보다언제 큰따옴표가 필요합니까?

이 스크립트에는 다음을 사용해야 합니다.선두bash여기 문서나 스크립트의 확장은 시작 중인 쉘 이 아닌 호출 쉘에 의해 실행됩니다 . 여기에서 초기 문서의 일부를 구분 기호로 인용하여 여기에서 문서를 참조할 수 있습니다.

이러한 모든 요소를 ​​고려하여 다음을 사용할 수 있습니다.

bash -s "$1" test1 test2 <<'END_SCRIPT'
function mytest {
        echo "$2"
        echo "$3"
}

mytest "$@"
END_SCRIPT

또는 다음을 사용하여 sh:

sh -s "$1" test1 test2 <<'END_SCRIPT'
mytest () {
        echo "$2"
        echo "$3"
}

mytest "$@"
END_SCRIPT

관련 정보