독립 실행형 스크립트로 함수가 있는데 getopts가 있는 동일한 스크립트에 이 함수를 넣고 값을 함수에 전달하여 출력을 얻을 port.sh
수 있는지 궁금합니다 .OPT_B
OPT_B=B
while getopts :a FLAG; do
case $FLAG in
b) #set option "b"
OPT_B=$OPTARG
;;
esac
done
shift $((OPTIND-1))
!!-->> port $1 <<--!! -> OPT_B=$(port $1) ??
function port()
{
if [ "$1" = 'B' ]; then
set $1=8000
echo "declared value: $1"
elif [[ "$1" =~ ^[0-9]+$ ]] && [ "$1" -ge 1 -a "$1" -le 10000 ]; then
echo "chosen value: $1"
else echo "chosen value $1 is not in '1 - 10000'"
fi
return 0;
}
답변1
사용하지 마십시오 function port()
. 실제로는 아무 의미가 없습니다. command bash
로 ksh
함수를 선언할 때 function
the를 사용하지 않지만 ()
쉘은 이를 용서할 수 있는 구문으로 받아들이고 function
전혀 사용하지 않은 것처럼 동작합니다. 그러지 마세요.
port()
case ${1:--} in (B) OPT_B=8000;; (*[!0-9]*)
! printf 'chosen value %s not in %s\n' \
"${1:-''}" "'1 - 10000'" ;;
(*) [ "$(( $1>0 && $1<10001 ))" -ne 0 ] &&
echo "chosen value '$1'" ||
port "'$1'" ;;
esac
이것은 함수를 작성하는 POSIX 올바른 방법입니다.(위의 경우는 에러 발생 시 올바른 반환이 발생하는 경우는 제외). 위의 내용이 쉘 스크립트에 있고 $0
어쨌든 함수를 호출하고 싶다면 다음과 같이 할 수 있습니다.
eval "$(sed '/^port()/,$!d;/esac/q' /path/to/script_containing_port.sh)"
port B #or whatever
^port()
... 이 스크립트에서 처음 나타나는 부분이 선언하려는 함수의 시작 부분을 확실히 나타낸다고 판단할 수 있다면 말이죠 . 그렇지 않고 함수가 자체 스크립트에 있는 경우 다음을 수행합니다.
. /path/to/port.fn.sh; port B
마지막으로 스크립트 파일의 이름을 지정하면 안 됩니다.뭔가.sh실제로 sh
스크립트가 아닌 한, 즉 bash
스크립트를 작성하는 경우 이름을 지정 something.bash
하지 않으면 의미가 없습니다.