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
For head
및 저는 ' , 및 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 및 for pregion
와 같은 목록의 정적 위치에서 값을 가져올 수 있습니다 .$1
$this
$2
$that
또, 그런데 shift 2
거기를 사용하는 것은 위험해요. 셸에 따라 변환할 인수가 부족하여 자동으로 실패할 수도 있습니다. 예를 들어 set a b c; shift 4; echo $1
Dash에서는 오류가 발생하고 종료되지만 Bash에서는 a
. 사용자가 해당 옵션 매개변수 없이 옵션을 제공하면 옵션 구문 분석이 루프에 걸릴 수 있습니다.