getopt 또는 optparse를 사용하여 옵션을 설정할 때 대시 하나가 문자 하나에 해당한다는 것을 알고 있습니다. 하지만 어쨌든 여러 문자에 단일 대시를 사용할 수 있습니까 -apply
?
대시는 짧은 이름을 나타내며 일반적으로 사람들은 이를 나타내기 위해 하나의 문자를 사용한다는 것을 알고 있습니다. 그러나 일부 명령(예: find -printf
)은 단일 대시가 포함된 긴 이름을 사용합니다.
Linux의 bash에서 대시와 함께 긴 이름을 사용하는 방법을 아는 사람이 있습니까( getopt
또는 optparse
다른 bash 도구 사용)?
답변1
답변2
GNU 시스템이 있고 단일 대시 긴 옵션이 필요한 경우 반드시 getopt_long
또는 를 사용하십시오 getopt -a
.
이 예는 find -printf
GNU 확장에 대한 나의 관심을 끌었습니다. find
원 대시 옵션은 GNU 시스템 외부에 존재하며 그 유산은 아마도 GNU 스타일의 긴 옵션보다 훨씬 오래되었을 것입니다. 따라서 이와 같은 프로그램은 을 find
사용하지 않고 getopt_long
명령줄 옵션을 수동으로 구문 분석할 수 있습니다. Bash에서는 다음과 같이 보일 수 있습니다:
$ cat args.sh
#!/bin/sh
foo=0
bar=0
while [ "$#" -ne 0 ] ; do
if [ "$1" = "-foo" ] ; then
foo=1
elif [ "$1" = "-bar" ] ; then
shift
bar=$1
fi
shift
done
echo foo: "$foo"
echo bar: "$bar"
$ ./args.sh -bar x -foo
foo: 1
bar: x
답변3
단일 문자 옵션을 구문 분석할 때 어려운 점은 번들로 묶일 수 있다는 것입니다(예: -ab
와 동일 -a -b
). GNU 스타일 긴 옵션의 한 가지 어려움은 인수가 연결될 수도 있고 연결되지 않을 수도 있다는 것입니다. 단일 대시 다중 문자 옵션을 사용하면 구문 분석에 어려움이 없으므로 수동으로 쉽게 수행할 수 있습니다.
단일 대시 다중 문자 옵션이 있는 대부분의 프로그램은 별도의 명령줄 인수로 인수를 허용합니다.
foo=
bar=default
require_argument () {
if [ $# -eq 2 ]; then
echo >&2 "$0: Option $1 requires an argument"
exit 2
fi
eval "$1=\"\$3\""
}
while case "$1" in
--) shift; false;;
-foo) foo=1
-bar) require_argument bar "$@"; shift;;
-?*) echo >&2 "$0: Unknown option $1"; exit 2;;
*) false;;
esac
do
shift
done
GNU 스타일의 긴 옵션을 사용해 보세요. 그들의 행동은 더욱 표준화되었고 더 많은 사람들이 이에 익숙해졌습니다.