단어 분할 없이 긴 문자열을 배싱하시겠습니까?

단어 분할 없이 긴 문자열을 배싱하시겠습니까?

다음과 같은 긴 명령으로 일부 스크립트를 구성하고 싶습니다.

{ somecheck || somecomand "reallyreallyreallyreallyreallyreallylongstring" } &> /dev/null &

다음과 같이 됩니다:

{ somecheck ||                   \
    somecomand "reallyreally"    \
        "reallyreally"           \
        "reallyreally"           \
        "longstring"             \
} &> /dev/null &

하지만 분사가 걱정됩니다. 이를 피하기 위해 다음을 고려하고 있습니다.

{ somecheck ||                   \
    somecomand  "$(echo          \
        "reallyreally"           \
        "reallyreally"           \
        "reallyreally"           \
        "longstring"             \
    )"                           \
} &> /dev/null &

bash/zsh에서 여러 줄 문자열을 실행하는 다른 방법을 아는 사람이 있습니까? 이 정보를 검색하는 데 문제가 있습니다. 적어도 세 가지 프로세스(스크립트, 배경 블록 및 명령 대체 하위 쉘)를 의미하는 것 같습니다. 더 좋은 방법이 있을까요?

미리 감사드립니다!

답변1

이와 같이 줄 연속을 사용하면 문자열에 공백이 추가됩니다. 시퀀스는 backslash-newline-whitespace단일 공백으로 대체됩니다.

변수를 사용하는 것만으로도 가독성이 크게 향상됩니다.

url="reallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongstring"
{ somecheck || somecomand "$url" } &> /dev/null &

여전히 배열을 사용하여 하위 문자열로 나눌 수 있습니다.

parts=(
    "reallyreallyreallyreally"
    "reallyreallyreallyreally"
    "reallyreallyreallyreally"
    "reallyreallyreallyreally"
    "longstring"
)
whole=$(IFS=; echo "${parts[*]}")

그러나 추가된 복잡성을 고려할 때 리터럴 문자열을 분할하는 것이 실제로 그렇게 중요합니까?

답변2

음, 조금 단순화할 수 있습니다:

$ [ -f /dev/null ] || sed 's/a/A/g' <(echo "thisis""avery"\
"long""string"\
"Ihave""separated"\
"into""smaller"\
"substrings")
thisisAverylongstringIhAvesepArAtedintosmAllersubstrings

중요한 것은 입력 문자열에 추가 공백이 없어야 한다는 것입니다 \.

변수 사용에 대한 Glenn의 조언은 훌륭하고 간단합니다. 그대로 두십시오.

답변3

나는 Glenn의 두 제안 사이 어딘가에 접근 방식을 제안합니다. 즉, (간단한 스칼라) 변수를 사용하되 정의를 여러 줄로 나누는 것입니다.

myword="super"
myword="${myword}cali"
myword="${myword}fragil"
myword="${myword}istic"
myword="${myword}expi"
myword="${myword}ali"
myword="${myword}docious"

관련 정보