수색…


통사론

  • 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 , ama 만이 출력됩니다.

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 spacesI 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 $packsapt-get 인수로 모든 공백으로 구분 된 패키지 이름을 보내는 반면 인용하면 $packs 문자열을 단일 인수로 보내고 apt-getapache2 php php-mbstring php-mysql 라는 패키지를 설치하려고 시도합니다 apache2 php php-mbstring php-mysql 분명히 존재하지 않는 apache2 php php-mbstring php-mysql (첫 번째 경우)

무엇을, 언제 그리고 왜 기본을 참조하십시오.

구분 기호 변경으로 나누기

다음 예제와 같이 공간에서 새 행으로 구분 기호를 간단히 대체 할 수 있습니다.

echo $sentence | tr " " "\n"

변수 sentence 의 값을 나눠서 한 줄씩 표시합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow