매개변수의 개별 라인을 처리할 수 있는 다른 bash 함수 구현을 사용해 왔습니다.
var1="
First Argument
A new line"
var2="
Second Argument
A new line"
호출 기능은
theone $var
분사는 금지됩니다.
하지만 함수 내에서는 여전히 $@
.
theone ()
{
for vl in "$@"; do
printf '%s\n' "$vl"
done
}
내가 원하는 것은 개행 문자로 나누는 것입니다.
답변1
theone $var
각 단어에 대해 분할을 호출합니다 $var
. 첫 번째 인수는 First
, 두 번째 인수는 Argument
, 세 번째 인수는 입니다 A
. 이 접근 방식을 사용하면 포함된 개행 문자가 손실되고 따옴표가 없는 변수와 마찬가지로 문자열에서 쉘 와일드카드( *
, [
, ]
, ?
)가 포함된 모든 단어는 와일드카드로 처리되어 현재 디렉터리 일치 항목의 이름과 일치됩니다. surety
현재 디렉터리에 있는 파일을 호출한 경우 "Are you 확실합니까??"와 같은 문자열은 "Are you 확실합니까"로 확장될 수 있습니다. 일반적으로 말하면 이는 좋은 생각이 아닙니다.
당신의 말에 따르면이전 질문theone "$var"
나는 단어 분리가 발생하지 않고 여러 줄의 매개변수가 있는 다음 과 같이 작성해야 한다고 제안합니다 theone
.
각 행을 개별적으로 처리 하려면 $var
다양한 구성을 제안해 드릴 수 있습니다. 각각에서 printf
이 줄은 내부 루프에서 처리되는 내용을 명확하게 보여주기 위해 작성되었습니다. 각각 전화하십시오 theone "$var"
:
POSIX
theone() { printf '%s\n' "$@" | while IFS= read -r vl do printf '## vl: %s ##\n' "$vl" done }
다음과 같은 껍질
bash
theone() ( for arg in "$@" do while IFS= read -r vl do printf '## vl: %s ##\n' "$vl" done <<< "$arg" done )
조개껍질도 있습니다.
bash
theone() ( for arg in "$@" do readarray -t vls <<<"$arg" for vl in "${vls[@]}" do printf '## vl: %s ##\n' "$vl" done done )
실제로 단일(여러 줄) 매개변수만 전달하려는 경우 가장 바깥쪽 루프를 제거하여 이 모든 것을 단순화할 수 있습니다. 예를 들어 마지막 항목은 다음과 같이 작성할 수 있습니다.
다음과 같은 껍질
bash
theone() { local vls vl readarray -t vls <<<"$1" for vl in "${vls[@]}" do printf '## vl: %s ##\n' "$vl" done }