Bash long string, sem divisão de palavras?

6

Eu quero arrumar alguns scripts com comandos longos, para que, por exemplo:

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

torna-se algo como:

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

Mas estou preocupado com a divisão de palavras. Para evitar isso, estou considerando isso:

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

Alguém sabe alguma outra maneira de fazer strings de múltiplas linhas no bash / zsh? Estou tendo problemas para pesquisar essas informações, e acho que isso significará pelo menos três processos (o script, o bloco de plano de fundo e a subcamada de substituição de comando); Talvez exista uma maneira melhor?

Obrigado antecipadamente!

    
por ferhtgoldaraz 12.04.2015 / 13:53

3 respostas

6

Usar continuações de linha como essa adicionam espaços à sua string: a seqüência backslash-newline-whitespace será substituída por um único espaço.

O uso de variáveis apenas contribuirá para melhorar a legibilidade:

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

Você ainda pode dividir isso em substrings, usando uma matriz

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

mas é tão importante dividir strings literais dada a complexidade adicional?

    
por 12.04.2015 / 14:19
2

Bem, você pode simplificá-lo um pouco para:

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

O ponto importante é não ter nenhum espaço em branco extra na string de entrada, portanto, nenhum espaço ao redor do \ .

A sugestão de Glenn de usar variáveis é mais bonita e mais simples, mas vá com isso.

    
por 12.04.2015 / 22:59
0
Sugiro uma abordagem que esteja a meio caminho entre as duas sugestões de glenn: use uma variável (simples, escalar), mas quebre sua definição em várias linhas:

myword="super"
myword="${myword}cali"
myword="${myword}fragil"
myword="${myword}istic"
myword="${myword}expi"
myword="${myword}ali"
myword="${myword}docious"
    
por 13.04.2015 / 00:02