나는스크립트표준으로getopt
마법, 스크립트를 호출할 수 있습니다.
batman-connect -c ffki
대시 없이 단 하나의 옵션으로 이 스크립트를 호출하는 옵션을 추가하려면 어떻게 해야 합니까?
batman-connect ffki
-c
따라서 이 유일한 옵션을 ?의 두 번째 인수 로 해석합니다 .
~에 따르면이 답변나는 시도했다:
if [ $@ = "ffki" ]; then
set -- "-c $@"
fi
하지만 이것은 내 라인 때문에 오류가 발생한다고 생각합니다.스크립트다음으로 다시 변경하세요.
# Execute getopt on the arguments passed to this program, identified by the special character $@
PARSED_OPTIONS=$(getopt -n "$0" -o hsrvVi:c: --long "help,start,restart,stop,verbose,vv,version,interface:,community:" -- "$@")
전체 스크립트를 재정렬하는 것을 좋아하지 않습니다. 첫 번째 매개변수를 "-c"로 설정하고 두 번째 매개변수를 "ffki"로 설정하는 간단한 한 줄이 있습니까?
답변1
당신은 다음과 같은 것을 할 수 있습니다
if [ $# = 1 ]; then
# do whatever you'd do when there is only one argument
else
# do the getopt bits
fi
# do what you'd do in either case
-c가 지원하려는 유일한 스위치인 경우 getopt가 필요하지 않으며 다음과 같이 수행할 수 있습니다.
#!/bin/bash
usage() {
echo "Usage: $0 [ -c ] arg" >&2
exit 1
}
if [ $# = 2 ]; then
if [ $1 = "-c" ]; then
shift
c_switch_value="$1"
else
usage
fi
elif [ $# = 1 ]; then
c_switch_value="$1"
else
usage
fi
이것이 더 읽기 쉬운지 여부는 논쟁의 여지가 있습니다.
답변2
이 스크립트의 시작 부분에 다음을 추가했습니다.
if [ $# = 1 ]; then
# If there is only one argument, replace the current process with the new invocation of the script
# the only option will be used as -c option
exec "$0" -c "$@"
fi
이것은 원래 질문에 대한 답변은 아니지만 내 특별한 경우에 적합한 해결 방법입니다.
답변3
if [ $@ = "ffki" ]; then
절의 명령은 위치 인수를 구성하는 단어의 와일드카드 확장 목록으로 if
확장되고 그 뒤에 단어가 옵니다 . 일반적으로 큰따옴표 밖에 있으면 "값 "을 의미하는 것이 아니라 "값을 별도의 단어로 분할하여 와일드카드로 해석함"을 의미합니다. 바라보다[
=
ffki
]
$VAR
VAR
VAR
공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?
특별한 경우 도 있습니다 "$@"
. 개별 단어(따옴표에도 불구하고)가 아니라 위치 인수 목록(추가 확장 없이)으로 확장됩니다. 공백으로 구분된 위치 인수로 구성된 단일 단어로 확장되는 를 사용할 수 있습니다 "$*"
(보다 정확하게는 값의 첫 번째 문자로 구분됨 IFS
). 따라서 값이 있는 단일 위치 매개변수가 있는지 테스트하려면 ffki
다음을 사용할 수 있습니다.
if [ "$*" = "ffki" ]; then
또는 위치 매개변수의 수를 계산하고 해당 값을 개별적으로 테스트할 수 있습니다. 예를 들어 값에 공백이 포함되도록 하려면 이 작업이 필요합니다.
if [ $# -eq 1 ] && [ "$1" = "ffki" ]; then
위치 매개변수를 변경하려면 이미 완료되었습니다. set
내장 함수를 사용하고 새로운 위치 매개변수 세트를 별도의 인수로 전달하세요. 첫 번째 인수가 Something으로 시작될 위험이 있는 경우 옵션으로 해석되지 않도록 -
이를 사용하세요 .set -- …
if [ "$*" = "ffki" ]; then
set -- -c "ffki"
fi
답변4
아마도 다음과 같은 것을 원할 것입니다.
# getopt code that sets "$c_value" goes here ...
# ... then
if [[ -z $c_value ]] && (( $# > 0 )); then
c_value=$1
shift
fi