이것은 내가 당신이 그것을해야한다고 제안하는 방법이며, 그 이유를 설명 할 것이지만, 먼저 다른 것에 대해 이야기하고 싶습니다 ...
set -- 'Arg 1: Line 1.' \
'Arg 2: Line 2.' \
'and so on for' \
'as long as you might like.'
var="$*"
여기에있는 다른 많은 해결책은 확장 방법을 변경하여 쉘 변수의 내용에 어떻게 든 영향을 줄 수 있다고 제안하는 것 같습니다. 나는 이것이 사실이 아니라고 확신 할 수있다.
string="some stuff here \
some more stuff here."
echo $string ${#string}
echo "$string" "${#string}"
산출
some stuff here some more stuff here. 53
some stuff here some more stuff here. 53
위에서 본 것은 먼저 필드 분할 확장, 확장 소스 변수의 바이트 수에 대한 보고서, 따옴표로 구분 된 확장 및 동일한 바이트 수입니다. 출력은 다를 수 있지만 쉘 변수의 내용은 $string
할당을 제외하고 전혀 변경되지 않습니다.
더군다나, 왜 그런지 이해하지 못한다면, 조만간 매우 불쾌한 놀라움에 직면하게 될 것입니다. 다시 시도하지만 약간 다른 조건에서 시도하겠습니다.
IFS=sf
echo $string ${#string}
echo "$string" "${#string}"
동일 $string
-다른 환경.
산출
ome tu here ome more tu here. 53
some stuff here some more stuff here. 53
필드 분할은에 정의 된 필드 구분 기호를 기반으로합니다 $IFS
. $IFS
공백과 $IFS
다른 두 가지 구분 기호가 있습니다. 기본적으로 3 개의 가능한 공백 값인 $IFS
값 공간 탭 줄 바꾸기 가 지정 $IFS
됩니다. 위에서 볼 수 있듯이 쉽게 변경되며 필드 분할 확장에 큰 영향을 줄 수 있습니다.
$IFS
공백은 순서대로 단일 필드로 echo
제거되므로 공백을 $IFS
포함 할 때 공백 시퀀스를 포함하는 확장 은 단일 공백으로 만 평가됩니다 echo
. 공백에 대한 인수를 연결 하기 때문 입니다. 그러나 어떤 공백이 아닌 값은 같은 방식으로 생략하다하지 않으며, 각각의 발생 구분 기호는 항상 자신에게 필드를 얻을 수 -에서 볼 수있는 물건 위의 확장.
이것은 최악이 아닙니다. 이 다른 것을 고려하십시오 $string
.
IFS=$space$tab$newline
cd emptydir
string=" * * * \
* * * "
echo $string ${#string}
echo "$string" "${#string}"
산출
* * * * * * 30
* * * * * * 30
알 겠어? 자, 환경을 다시 바꿔 봅시다.
touch file1 file2 file3 file4 file5
echo $string ${#string}
echo "$string" "${#string}"
산출
file1 file2 file3 file4 file5 file1 file2 file3 file4 file5 file1 file2 file3 file4 file5 file1 file2 file3 file4 file5 file1 file2 file3 file4 file5 file1 file2 file3 file4 file5 30
* * * * * * 30
우와
기본적으로 쉘은 파일 이름이 일치 할 경우 파일 이름 글로브를 확장합니다. 이는 매개 변수 확장 및 구문 분석 순서에서 필드 분할 후에 발생 하므로 인용되지 않은 문자열은 이러한 방식으로 취약합니다. 원하는 경우이 동작을 해제 할 수 set -f
있지만 POSIX 호환 쉘은 항상 기본적으로 사용됩니다.
이것은 들여 쓰기 환경 설정에 맞게 확장에 따옴표를 놓을 때 대비하는 종류입니다. 그럼에도 불구하고 모든 경우에 확장 동작에 관계없이 실제 값 $string
은 항상 마지막으로 할당했을 때의 값입니다 . 첫 번째로 돌아 갑시다.
set -- 'Arg 1: Line 1.' \
'Arg 2: Line 2.' \
'and so on for' \
'as long as you might like.'
var="$*"
echo "$var" "${#var}"
산출
Arg 1: Line 1. Arg 2: Line 2. and so on for as long as you might like. 70
나는 이것이 쉘 구문을 들여 쓰기 환경 설정에 적용하는 훨씬 더 안전한 방법이라고 생각합니다. 위에서하고있는 것은 각 개별 문자열을 위치 매개 변수에 할당하는 것입니다. 위치 매개 변수는 각각 $1
또는 유사한 번호로 참조 할 수 있습니다. ${33}
그런 다음 $var
특수 쉘 매개 변수 를 사용하여 연결된 값을 할당합니다 $*
.
이 접근법은에도 면역이되지 않습니다 $IFS
. 그럼에도 불구하고, 나는 이와 관련 $IFS
하여 추가 혜택 과의 관계를 고려합니다 . 치다:
IFS=\ ;space_split="$*"
IFS=/; slash_split="$*";IFS='
';new_line_split="$*"
echo "$space_split"
echo "$slash_split"
echo "$new_line_split"
산출
Arg 1: Line 1. Arg 2: Line 2. and so on for as long as you might like.
Arg 1: Line 1./Arg 2: Line 2./and so on for/as long as you might like.
Arg 1: Line 1.
Arg 2: Line 2.
and so on for
as long as you might like.
보다시피 , 첫 번째 바이트에서 $*
각 arg를 연결합니다 . 따라서 다르게 할당 된 상태에서 값을 저장하면 저장된 각 값마다 다른 필드 구분 기호가 사용됩니다. 위에서 본 것은 각 변수의 리터럴 값입니다. 구분자를 전혀 원하지 않으면 다음을 수행하십시오."$@"
$IFS
$IFS
IFS=;delimitless="$*"
echo "$delimitless" "${#delimitless}"
산출
Arg 1: Line 1.Arg 2: Line 2.and so on foras long as you might like. 67