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
합니다 .sh
function
함수( 내장 명령 이름 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