set 명령에 특수 와일드카드 문자 전달

set 명령에 특수 와일드카드 문자 전달

"set" 명령을 사용하여 특수 기호 "*"로 변수를 설정하고 싶습니다.

$ Q='A * B'
$ set -- $Q
$ echo "$1 $2 $3"

나는 "A*B"를 기대했다

물론 별표는 특수 기호이기 때문에 예상대로 작동하지 않습니다.

나는 시도했다:

$ Q='A \* B'
$ Q='A "*" B'

그러나 다음으로 전달됩니다.$2

기대했던 것 A \* B보다 그런 걸 얻었어A "*" BA * B

이 표현식을 set 명령에 올바르게 전달하는 방법은 무엇입니까?

답변1

이상한 동작을 방지하려면 항상 변수를 인용해야 합니다. 따라서 set -- "Q"단지 set -- $Q.

$ Q='A * B'
$ set -- "$Q"
$ echo "$1 $2 $3"
A * B

답변2

Q를 3개의 개별 단어로 만들려면 배열을 사용해야 합니다.

Q=(A '*' B)
set -- "${Q[@]}"    # you must use this syntax to expand the array safely.
printf '%s\n' "$@"  # print the positional params on separate lines
A
*
B

바라보다http://mywiki.wooledge.org/BashFAQ/050자세한 내용은.

답변3

문제를 해결하는 방법을 들었습니다(내 생각에는 배열 접근 방식이 더 낫다고 생각합니다). 빠진 것은 설명입니다.

따옴표( ", ', \)는 명령줄에만 적용됩니다(즉, 셸 파서가 문자 그대로 이를 발견하는 경우). 변수의 일부인 경우 이는 단지 문자열일 뿐입니다. 변수에는 와일드카드 문자와 토큰화 문자만 관련됩니다.

예외는 일반적으로 eval"명령줄 수준"에서 변수의 내용을 가져오는 것입니다. 그러나 이것이 좋은 생각인 경우는 거의 없습니다.

Q='A "*" B'

echo $Q
A "*" B

eval echo $Q
A * B

또 다른 옵션은 와일드카드를 비활성화하는 것입니다.

Q='A * B'

set -f

echo $Q
A * B

관련 정보