$i가 명령줄 인수(Bash 스크립트에서)와 같은지 확인하려면 다음을 사용합니다.
if [[ " $@ " =~ " $i " ]]
더 좋은 방법이 있나요?
내 말은, 더 추천할 수 있고 더 다재다능하지만 거의 마찬가지로 간단한 방법입니다.
내 말이 맞다면 위의 내용은 $i와 각 명령줄 인수에 공백이 포함되어 있지 않을 때 작동합니다. 대부분의 경우에는 문제가 없지만 간단한 수정이나 기타 간단한 개선이 있을 수 있습니다.
이 특별한 경우에는 $*가 잘 작동한다고 생각하지만 일반적으로 더 권장됩니까? 차이점은 여기에서 확인할 수 있습니다.https://stackoverflow.com/questions/3898665/what-is-in-bash
답변1
로 전환할 수 있는 옵션이 있는 경우 zsh
다음과 같아야 합니다.
set 'foo bar' 1:2 $'a\nb'
i='foo bar'
if (( n = $argv[(Ie)$i] )); then
print -r -- "$i is found among the positional parameters, in \${$n} at least"
fi
에서는 csh와 마찬가지로 zsh
위치 매개변수를 배열에 사용할 수도 있습니다 . 정렬$argv
I
아래 첨자 기호아래 첨자를 패턴으로 처리하고 확장 시 I
값이 패턴과 일치하는 마지막 요소의 인덱스를 반환합니다(찾지 못하는 경우 0). 패턴 일치 e
대신 xact 일치에 사용됩니다 . e
여기서는 결과를 n
ksh 스타일 산술 표현식에 할당합니다(표현식이 평소와 같이 0이 아닌 값으로 확인되면 true를 반환함).
에서는 with의 모든 요소와 일치하는 패턴을 zsh
구성할 수도 있습니다 .$@
pattern="(${(j[|])${(b)@}})"
저기,b
매개변수 확장 플래그glob을 탈출하고 j[|]
결과 요소를 와 연결하면 예를 들어 다음과 같은 패턴이 |
됩니다 .(foo|bar|\*|)
set -- foo bar '*' ''
다음과 같이 사용됩니다:
if [[ $i = $~pattern ]]...
그러나 위치 인수 목록이 비어 있으면 ()
빈 문자열과 잘못 일치하는 패턴이 생성됩니다.
최종 목표가 위치 인수에서도 발견되는 배열 요소를 찾는 것이라면 zsh의 배열 교차 연산자를 사용할 수 있습니다 ${A:*B}
.
set a A 'x y'
array=(a b 'x y' a)
print -r Found in argv: ${array:*argv}
$i
Bash 또는 POSIX 셸에서 문자를 알고 있거나 위치 인수가 나타나지 않으면 다음을 수행할 수 있습니다.
IFS=: # join "$*" with :
case ":${*}:" in
(*:"$i":*) printf '%s\n' "$i is among the positional parameters";;
esac
kshism 대신 표준 sh 구문을 사용하고 [[ ... ]]
이식성이 없다는 점(bash 버전에서도) ( =~
bash의=~
간단한 문자열과 비교하여 텍스트가 아닌 문자열에 대한 블록도 포함)을 제외하고 접근 방식과 유사합니다. 여기서는 임의의 공백과 달리 사용 사례 또는 위치 매개변수에 나타날 가능성이 가장 낮은 항목이 무엇인지 알아야 합니다. 또한 목록 컨텍스트 외부에서 사용되는 경우에는 거의 의미가 없으며 동작은 셸마다 다릅니다. 위치 인수와 연결될 첫 번째 문자가 지정되도록 명시적으로 지정된 비목록 컨텍스트에서 의미가 있습니다.=
:
$i
"$@"
"$*"
$IFS
[[ ... ]]
대신 ksh 스타일을 사용할 수 있습니다 case
.
if [[ ":${*}:" = *:"$i":* ]]...
임의의 값을 사용하려면 bash
루프를 사용해야 합니다.
found=false
for arg do
if [ "$arg" = "$i" ]; then
found=true
break
fi
done
if "$found"; then
printf '%s\n' "$i is among the positional parameters"
fi
도우미 함수를 정의할 수도 있습니다.
among() {
local needle="$1" arg
shift
for arg do
[ "$arg" = "$needle" ] && return
done
false
}
if among "$i" "$@"; then
printf '%s\n' "$i is among the positional parameters"
fi
답변2
$i
Bash 스크립트에서 명령줄 인수와 동일한지 확인하려면 다음을 사용합니다.if [[ " $@ " =~ " $i " ]]
가장 좋은 시나리오는 명령줄을 확인하여 다음 사항을 확인하는 것입니다.포함하다의 가치 $i
. 예를 들어, i=the
명령줄 인수 중 하나가 있으면 the elephant
조건이 일치합니다.
그러나 which도 사용했는데 $@
, 큰따옴표 안에 사용하면 일반적으로 인용된 일련의 인수 단어로 확장됩니다. 여기서는 "$*"
.(use는 올바른 일을 bash
하며 단일 문자열로 사용되지만 이것이 use가 정확하다는 의미는 아닙니다 .)[[ … ]]
$@
$@
그렇게 하는 것이 더 낫지만, 여전히 영향을 받습니다.포함하다대신에동일한:
if [[ " $* " =~ " $i " ]]
다음 사항을 확인하세요.$i
동일한컬렉션의 모든 명령줄 매개변수를 반복해야 한다고 생각합니다.
success=false
for arg in "$@"; do [[ "$arg" = "$i" ]] && { success=true; break; }; done
if "$success"
이를 좀 더 우아하게 표현하면 다음과 같습니다.또 다른 대답함수로 among
.