개행으로 분할

개행으로 분할

매개변수의 개별 라인을 처리할 수 있는 다른 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":

  1. POSIX

    theone()
    {
        printf '%s\n' "$@" |
            while IFS= read -r vl
            do
                printf '## vl: %s ##\n' "$vl"
            done
    }
    
  2. 다음과 같은 껍질bash

    theone()
    (
        for arg in "$@"
        do
            while IFS= read -r vl
            do
                printf '## vl: %s ##\n' "$vl"
            done <<< "$arg"
        done
    )
    
  3. 조개껍질도 있습니다.bash

    theone()
    (
        for arg in "$@"
        do
            readarray -t vls <<<"$arg"
    
            for vl in "${vls[@]}"
            do
                printf '## vl: %s ##\n' "$vl"
            done
        done
    )
    

실제로 단일(여러 줄) 매개변수만 전달하려는 경우 가장 바깥쪽 루프를 제거하여 이 모든 것을 단순화할 수 있습니다. 예를 들어 마지막 항목은 다음과 같이 작성할 수 있습니다.

  1. 다음과 같은 껍질bash

    theone()
    {
        local vls vl
    
        readarray -t vls <<<"$1"
    
        for vl in "${vls[@]}"
        do
            printf '## vl: %s ##\n' "$vl"
        done
    }
    

관련 정보