여러 줄을 사용하여 변수 할당

여러 줄을 사용하여 변수 할당

기능이 있어요

f(){
    echo 777
}

그리고 함수의 "반환 값"을 할당하는 변수입니다.

x=$(f)

매우 간결합니다! 그런데 제 실제 코드에서는 변수명과 함수명이 꽤 길고 함수도 위치 매개변수를 사용하기 때문에 위의 간결한 줄이 매우 길어집니다. 나는 일을 깔끔하게 유지하는 것을 좋아하기 때문에 위의 코드를 두 줄로 나누고 싶습니다.

x=\
$(f)

여전히 작동합니다! 하지만 깔끔하게 유지하는 것은 들여쓰기를 존중하는 것을 의미하므로 이는 다음과 같은 결과를 제공합니다.

if foo
    x=\
    $(f)
fi

공백 때문에 더 이상 작동하지 않습니다! 좋은 해결책이 있나요?

답변1

왜 복잡하고 읽기 어려운 구조인가? 중간 작업, 빈 문자열을 구성하는 멋진 방법, 참조 미묘함 또는 기타 인지 부하가 ​​필요하지 않은 완전히 자연스러운 표현 방법이 있습니다.

if foo; then
    x=$(
      a_very_long_command_name --option1='argument 1 is long' \
                               --option2='argument 2 is long as well'
    )
fi

답변2

$_마지막 매개변수로 설정된 값을 저장할 수 있습니다 .

if foo; then
    : "$(f)"
    x=$_
fi

또는 하위 쉘을 사용하여 들여쓰기를 먹을 수 있습니다.

if foo; then
    x=$(
    )$(f)
fi

답변3

here-docs를 사용하도록 허용된 경우 다음 스타일이 잘 작동합니다. here-doc 문자열에서 선행 따옴표를 사용하면 -코드에서 탭 문자를 사용할 수 있습니다.오직.

그것은 마치

if true; then
        read -d '' -r x <<-EOF
        $(f)
        EOF
fi

그러나 Stack Exchange가 탭을 공백으로 대체하므로 위의 코드를 복사하여 붙여넣는 것은 작동하지 않습니다. Tabhere-doc로 시작하는 줄과 here-doc로 끝나는 줄의 문자를 주의 깊게 입력해야 합니다 . 내 vim구성에는 8개의 공백에 매핑된 탭이 있습니다. 좀 더 깔끔하게 만들고 싶다면 간격 규칙을 수정하여 vim아래와 같이 탭 사이의 간격을 4칸으로 설정하세요.:set tabstop=4

Tab다음을 사용하여 내 스크립트의 형식을 볼 수 있습니다.sed

$ sed -n l script.sh
#!/usr/bin/env bash$
$
$
f(){$
    echo 777$
}$
$
if true; then$
\tread -d '' -r x <<-PERSON$
\t$(f)$
\tPERSON$
fi$
$
echo $x$

\t위의 here-doc 문자열에 있는 문자를 참고하세요 . 스크립트가 위와 다르게 나타나면 예상치 못한 EOF오류가 발생하는 것을 보게 될 것입니다.

답변4

왜 등호로 줄을 나누나요? 별도의 변수에 함수의 매개변수를 설정할 수 있습니다.

unset args
args+='arg1 '
args+='arg2 '
args+='arg3 '
x=$(f $args)

관련 정보