나는 질문을 가장 간단한 경우로 축소하고 있습니다. myscript.sh
다음 내용 의 스크립트가 있다고 가정 해 보겠습니다 .
#!/bin/bash
IFS='%20'
echo "$*"
다음과 같이 명령을 실행하면 출력은 다음과 같습니다.
me@myhost ~ $ ./myscript.sh fee fi fo fum
fee%fi%fo%fum
이것은 bash
man 페이지에 설명 된대로 예상되는 동작입니다 .
* Expands to the positional parameters, starting from one. When
the expansion occurs within double quotes, it expands to a sin-
gle word with the value of each parameter separated by the first
character of the IFS special variable. That is, "$*" is equiva-
lent to "$1c$2c...", where c is the first character of the value
of the IFS variable. If IFS is unset, the parameters are sepa-
rated by spaces. If IFS is null, the parameters are joined
without intervening separators.
그러나 내가 얻고 싶은 것은 출력입니다.
fee%20fi%20fo%20fum
따라서 단일 문자가 아닌 여러 문자 분리기 필드를 사용합니다.
기본적으로 이것을 수행하는 방법이 bash
있습니까?
최신 정보:
아래 mikeserv의 데이터와 printf가 에코보다 나은 이유는 무엇입니까? , 결국 다음을 수행했습니다 (위의 예에서와 같이 가장 간단한 경우로 다시 축소됨).
#!/bin/bash
word="$1"
shift
if [ "$#" -gt 0 ] ; then
word="$word$(printf '%%20%s' "$@")"
fi
printf '%s\n' "$word"
unset word
printf
출력시 뒤에 오는 각 인수에 형식 문자열을 적용합니다. 그것은이다 bash
쉘 내장 및 인수 목록에 구분 기호 문자열을 적용 할 수 있습니다 -의 종류.
예를 들면 :
printf %s:delimit: arg1 arg2 arg3
arg1:delimit:arg2:delimit:arg3:delimit:
문제는 인수의 끝에 형식 문자열 적용을 중단printf
하지 않으므로 마지막 구분 기호가 추가됩니다. 다음과 같은 경우에 처리 할 수 있습니다.
printf %b:delimit: \\0150 \\0145 \\0171\\c
h:delimit:e:delimit:y
printf
C 및 8 진수 이스케이프를 %b
특정 형식의 ytes로 해석 하고 특정 지점에서 출력을 출력 한 %b
형식으로 도 해석 합니다. 따라서 형식 문자열이 표시 하는 것처럼 위의 y 뒤에 문자열을 사용하지 않습니다.\c
printf
:delimit:
따라서 모든 인수를 문자 그대로 해석 하고 후행 구분 기호를 사용하지 않으려면 인수 목록 자체에서 문제를 해결해야합니다.
set -- arg1 arg2 arg3
for arg do shift
set -- "$@" :delimit: "$arg"
done; shift
printf %s "$@"
arg1:delimit:arg2:delimit:arg3
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다