スタンドアロンスクリプトとして関数があり、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()
。実際には意味がありません。 commandbash
で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
意味がありません。