수색…
통사론
- IFS를 개행 문자로 설정 : IFS = $ '\ n'
- IFS를 null 문자열로 설정 : IFS =
- IFS를 / 문자로 설정하십시오 : IFS = /
매개 변수
매개 변수 | 세부 |
---|---|
IFS | 내부 필드 분리 기호 |
-엑스 | 명령과 명령이 실행될 때 인자를 출력합니다 (Shell 옵션). |
비고
- 할당 도중 단어 분리가 수행되지 않습니다. 예 :
newvar=$var
- 단어 분리는
[[ ... ]]
구문에서 수행되지 않습니다. - 단어 분리 방지를 위해 변수에 큰 따옴표를 사용하십시오.
IFS로 분할
좀 더 명확히하기 위해 showarg
라는 스크립트를 showarg
.
#!/usr/bin/env bash
printf "%d args:" $#
printf " <%s>" "$@"
echo
이제 차이점을 살펴 보겠습니다.
$ var="This is an example"
$ showarg $var
4 args: <This> <is> <an> <example>
$var
는 4 개의 인수로 나뉩니다.IFS
는 공백 문자이므로 공백에서 단어 분리가 발생했습니다.
$ var="This/is/an/example"
$ showarg $var
1 args: <This/is/an/example>
IFS
문자를 찾을 수 없으므로 위의 단어 분할이 발생하지 않았습니다.
이제 IFS=/
$ IFS=/
$ var="This/is/an/example"
$ showarg $var
4 args: <This> <is> <an> <example>
$var
는 단일 인수가 아닌 4 개의 인수로 분할됩니다.
왜, 언제 그리고 왜?
쉘이 매개 변수 확장 , 명령 대체 , 변수 또는 산술 확장 을 수행하면 결과에서 단어 경계를 검색합니다. 단어 경계가 발견되면 결과는 해당 위치에서 여러 단어로 나뉩니다. 단어 경계는 쉘 변수 IFS
(Internal Field Separator)로 정의됩니다. IFS의 기본값은 공백, 탭 및 줄 바꿈입니다. 즉, 명시 적으로 금지되지 않은 경우 세 공백 문자에서 단어 분리가 발생합니다.
set -x
var='I am
a
multiline string'
fun() {
echo "-$1-"
echo "*$2*"
echo ".$3."
}
fun $var
위의 예제에서 fun
함수가 실행되는 방법입니다.
fun I am a multiline string
$var
는 5 개의 args로 나뉘어지며, 단지I
,am
과a
만이 출력됩니다.
IFS 및 단어 분할
단어 분리에 대한 IFS의 제휴에 대해 모르는 경우 언제, 왜, 그리고 무엇을 참조하십시오.
IFS를 공백 문자로만 설정하십시오.
set -x
var='I am
a
multiline string'
IFS=' '
fun() {
echo "-$1-"
echo "*$2*"
echo ".$3."
}
fun $var
이 시간 단어 분리는 공백에서만 작동합니다. fun
함수는 다음과 같이 실행됩니다.
fun I 'am
a
multiline' string
$var
는 3 개의 인수로 나뉩니다.I
am\na\nmultiline
이고string
은 인쇄 될 것이다.
IFS를 개행 전용으로 설정합시다.
IFS=$'\n'
...
이제 fun
는 다음과 같이 실행됩니다.
fun 'I am' a 'multiline string'
$var
는 3 개의 인수로 나뉩니다.I am
, ,a
multiline string
인쇄 할 수 있습니다
IFS를 nullstring으로 설정하면 어떻게되는지 봅시다.
IFS=
...
이번에는 fun
가 다음과 같이 실행됩니다.
fun 'I am
a
multiline string'
$var
는 분할되지 않았습니다. 즉, 단일 arg로 남았습니다.
IFS를 null 문자열로 설정하여 단어 분리를 방지 할 수 있습니다.
단어 분리를 방지하는 일반적인 방법은 큰 따옴표를 사용하는 것입니다.
fun "$var"
위에서 논의 된 모든 경우에서 단어 분리를 방지합니다. 즉, fun
기능은 하나의 인수만으로 실행됩니다.
단어 분리의 나쁜 영향
$ a='I am a string with spaces'
$ [ $a = $a ] || echo "didn't match"
bash: [: too many arguments
didn't match
[ $a = $a ]
는[ I am a string with spaces = I am a string with spaces ]
[ $a = $a ]
로 해석되었습니다.[
I am a string with spaces
이I am a string with spaces
test
명령은 단일 인수가 아니라 6 개의 인수입니다!
$ [ $a = something ] || echo "didn't match"
bash: [: too many arguments
didn't match
[ $a = something ]
은[ I am a string with spaces = something ]
[ $a = something ]
로 해석되었습니다[ I am a string with spaces = something ]
$ [ $(grep . file) = 'something' ]
bash: [: too many arguments
grep
명령은 공백이있는 여러 줄 문자열을 반환하므로 몇 개의 인수가 있는지 상상해보십시오. : D
무엇을, 언제 그리고 왜 기본을 참조하십시오.
단어 분리의 유용성
단어 분리가 유용 할 수있는 경우가 있습니다.
배열 채우기 :
arr=($(grep -o '[0-9]\+' file))
그러면 파일에 있는 모든 숫자 값이
arr
채워집니다.
공백으로 분리 된 단어를 반복 :
words='foo bar baz'
for w in $words;do
echo "W: $w"
done
산출:
W: foo
W: bar
W: baz
공백을 포함하지 않는 공백으로 구분 된 매개 변수 전달 :
packs='apache2 php php-mbstring php-mysql'
sudo apt-get install $packs
또는
packs='
apache2
php
php-mbstring
php-mysql
'
sudo apt-get install $packs
그러면 패키지가 설치됩니다.
$packs
를 두 번 인용하면 오류가 발생합니다.
Unquoetd
$packs
는apt-get
인수로 모든 공백으로 구분 된 패키지 이름을 보내는 반면 인용하면$packs
문자열을 단일 인수로 보내고apt-get
은apache2 php php-mbstring php-mysql
라는 패키지를 설치하려고 시도합니다apache2 php php-mbstring php-mysql
분명히 존재하지 않는apache2 php php-mbstring php-mysql
(첫 번째 경우)
무엇을, 언제 그리고 왜 기본을 참조하십시오.
구분 기호 변경으로 나누기
다음 예제와 같이 공간에서 새 행으로 구분 기호를 간단히 대체 할 수 있습니다.
echo $sentence | tr " " "\n"
변수 sentence
의 값을 나눠서 한 줄씩 표시합니다.