plist
head
電話をかけてコマンドを発行する機能がありますtail
。しかし、その領域を処理するために別の関数を呼び出しましたpregion
。
# --- plist ---
("-H"|"--head")
local -r hn="$2" ; shift 2 ;;
("-T"|"--tail")
local -r tm="$2" ; shift 2 ;;
("--FS") # field separator
local fs="$2" ; shift 2 ;;
("--incl")
local incl+=("$2") ; shift 2 ;; # file type suffix
("--excl")
local excl+=("$2") ; shift 2 ;; # file type suffix
("--RP")
local pn=$2 ; shift 2 ;;
("--RQ")
local qn=$2 ; shift 2 ;;
("--dyn"|"--dynamic")
local dyn="1" ; shift 1 ;;
("-C"|"--context")
local ctx=$2 ; shift 2 ;;
("-d"|"--directory")
local fdir=$2 ; shift 2 ;;
(--)
shift; break ;;
...
if [[ -v hn ]]; then
head -v -hn "$n"
elif [[ -v tm ]]; then
tail -v -n "$tm"
elif [[ -v dyn ]]; then
pregion "$@" # requires original options here
fi
Forhead
と私は 'とtail
'オプションを使います。 optionsを処理するときに使用しているため、単にに渡すことはできないため、元の入力パラメータのコピーが必要です。-H
-T
--FS
--incl
shift
plist
"$@"
pregion
これは電話head
するかtail
plist -H 8 ./01cuneus
plist -T 13 ./01cuneus
通貨の例pregion
plist --dyn -C 8 "Martin" ./01cuneus
plist --incl .texi --incl .org --RP 8 --RQ 13 ./01cuneus
plist --incl .texi --incl .org --dyn -C 8 "Martin" ./01cuneus
答え1
元のパラメータを配列にコピーしてそれをpregion
。
plist() {
local -a origargs=("$@")
...
case
...
esac
...
if
...
elif [[ -v dyn ]]; then
pregion "${origargs[@]}"
fi
答え2
実際にコンテンツを保存できます$@
。
plist() {
local args
args=("$@")
case $1 in ...
# some shifting etc.
esac
if something; then
pregion "${args[@]}"
fi
}
ただし、これはpregion
オプションの全体プロセスを再度実行することを意味します。実際、両方の場所で同じプロセスを実装できます。無効なオプションを返すエラーはどうですかplist
?pregion
一部のオプションは許可されていますが許可されていない可能性があるため、電話をかけるかどうかを決定するまでこれを行うことはできませんplist
。
代わりに、オプションの解析を一度だけ実行し、個々の引数pregion
で解析された適切な値を使用して呼び出すことをお勧めします。
plist() {
local args
args=("$@")
local this=default that=otherdefault
local call_pregion=
case $1 in ...
this) this=$2; shift; shift;;
that) that=$2; shift; shift;;
dyn) call_pregion=1
esac
if [ "$call_pregion" ]; then
pregion "$this" "$that"
fi
}
これにより、forやforpregion
などのリストの静的位置から値を取得できます。$1
$this
$2
$that
また、ところでshift 2
そこを使うのは危険ですよ。シェルによっては、変換する引数が不足して自動的に失敗することもあります。たとえば、set a b c; shift 4; echo $1
Dashではエラーが発生して終了しますが、Bashではa
。ユーザーがオプション・パラメーターなしでオプションを指定すると、オプションの構文解析がループになる可能性があります。