이중 브래킷 전역 일치에 대한 Bash 대안

이중 브래킷 전역 일치에 대한 Bash 대안

반면

hasArgs=a:b:c:
x=b
if [[ ${hasArgs} = *$x:* ]] ; then …

위의 이중 괄호 테스트를 Bash에 덜 특화된 대안(하위 쉘/명령 등이 없음을 의미함)으로 대체할 수 있기를 바랍니다.

매개변수 확장은 변수를 소비하지 않기 때문에 도움이 되지 않습니다.

if [ "${hasArgs}" != "${hasArgs#$x:}" ] ; then …

이 사용 사례에 적합한 간단한(한 줄) 솔루션이 있습니까?

답변1

한 줄의 코드는 아니지만 매우 읽기 쉽고 확장하여 여러 인수를 확인할 수 있습니다.

hasArgs="a:b:c"
x=b
case "$hasArgs" in
    *$x*)
        echo "$x is present"
        ;;
esac

답변2

다음은 sh에서 실행됩니다:

if echo "$hasArgs" | grep -q "$x"; then

답변3

실제로 여기서는 표준 매개변수 확장을 사용할 수 있습니다(와일드카드가 누락되었을 뿐입니다).

$ args=a:b:c:
$ x=b
$ echo "${args%$x:*}"
a:
$ if [ "$args" != "${args#*$x:}" ]; then echo 'b: is present'; fi
b: is present

(또는 이에 상응하는 "${args%$x:*}")

단점은 뒤에 콜론을 넣어야 하므로 일반적인 콜론은 b일치 하지 않지만 역시 일치한다는 것입니다 . ( 그리고 명백한 패턴 매칭에도 같은 단점이 있습니다.)a:bba:bb:c[[ $var = *$x:* ]]case

일치하지 않고 b, b:c, a:b, 을 모두 일치시키는 것은 약간 까다롭습니다. 내가 생각할 수 있는 것은 이것 뿐이다.a:b:ca:bb:c

args=a:b:c
x=b
IFS=:                   # affects globally
set -f                  # affects globally...
for x in $args; do
    if [ "$x" = "b" ]; then
        echo "b is present"
    fi
done

모든 상황을 기록하고 싶지 않은 경우:

args=a:b:c
x=b
found=0
case "$args" in
    $x)     found=1;;
    $x:*)   found=1;;
    *:$x)   found=1;;
    *:$x:*) found=1;;
esac
if [ "$found" = 1 ]; then ...; fi

Bash에서 정규식을 사용하는 것이 더 쉽습니다.

args=b:c
x=b
if [[ $args =~ (^|:)$x(:|$) ]]; then
    echo "b found"
fi

관련 정보