기능이 있어요
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)