반면
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:b
b
a:bb:c
[[ $var = *$x:* ]]
case
일치하지 않고 b
, b:c
, a:b
, 을 모두 일치시키는 것은 약간 까다롭습니다. 내가 생각할 수 있는 것은 이것 뿐이다.a:b:c
a: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