뭘 이런걸..

Posted
Filed under Tech/프로그래밍
정말 오랜만에 blog 에 posting 을 해 봅니다 :)

bash 에서 옵션 처리를 할 경우, bash 의 내장 함수인 getopts 또는 GNU getopt 를 사용하게 되는데, 필자의 경우에는 long option 을 제공하는 GNU getopt 를 더 선호하는 편입니다.

하지만 GNU getopt 를 사용할 경우 치명적인 문제가 하나 있는데, 바로 옵션 값에 공백 문자가 있을 경우, getopt -> set 을 하는 과정에서 옵션 값의 공백문자를 기준으로 분리가 되어 버리는 문제 입니다. 예를 들어

#!/bin/bash

opts="$( getopt -o h -u -l help -- $@ )"
set -- ${opts}
echo "$@"
echo "$3"
와 같이 코드를 만들고, 실행을 하면 다음과 같이 출력이 됩니다.
[user@host ~]$ bash test.sh -h "1 2 3"
-h -- 1 2 3
1
출력되는 $3 은 기대하는 "1 2 3" 이 아니라 "1" 이 됩니다.

그래서 이 문제는 해결하기 위해서는 다음과 같이 해 볼 수 있습니다.

#!/bin/bash

for i
do
[[ $i =~ [[:space:]] ]] && opt[n++]="\"${i}\"" || opt[n++]="${i}"
done

opts="$( getopt -o h -u -l help -- ${opt[@]} )"
eval set -- ${opts}
echo "$@"
echo "$3"
결과는
[user@host ~]$ bash test.sh -h "1 2 3"
-h -- 1 2 3
1 2 3


2023/01/06 13:22 2023/01/06 13:22