Eu tenho uma variável x
com nova linha à direita.
printf -v x 'hello\n'
Como descobrir se o último caractere de x
é \n
?
Eu tenho uma variável x
com nova linha à direita.
printf -v x 'hello\n'
Como descobrir se o último caractere de x
é \n
?
Você descreve o último caractere da string, não os caracteres, portanto, está procurando uma maneira de detectar se é o caractere único (também
\n
conhecido comonewline
or, em ASCII,line feed
). Você não está procurando detectar se a string termina nos dois caracteres\
(barra invertida) en
.Aqui está uma maneira de fazer isso em versões bastante modernas do Bash:
${x: -1:1}
usa a expansão de substring do Bash para retornar o último caractere da string. A sintaxe na página do manual é${parameter:offset:length}
e observa que um deslocamento negativo começa no final da string, e não no início. Ele também observa que é necessário um espaço entre o primeiro:
e-1
para evitar confusão com um tipo diferente de expansão de parâmetro.$'\n'
usa a sintaxe "variante especial de aspas simples" do Bash para representar caracteres conforme especificado pelo "padrão ANSI C".O comando interno
printf
usa a-v
opção de gravar a saída na variável especificada em vez de stdout. Esta opção pode não estar disponível em todos os shells (e não está disponível em umprintf
binário externo).printf
suporta caracteres como\n
diretamente sem a sintaxe "variante especial".Conforme escrito, isso funcionará apenas para nova linha no final de uma variável, mas é isso que você pediu. A verificação de outros caracteres de controle e/ou outros locais na string exigirá uma sintaxe diferente que depende de suas necessidades específicas.
Em qualquer shell POSIX:
Em shells incluindo bash que suportam a
$'...'
forma de citação de ksh93 (e que será especificadash
na próxima versão do padrão POSIX), isso pode ser mais fácil de ler com:Outra opção para shells que não suportam
$'...'
é armazenar a nova linha em uma variável global:ou
para criar uma variável para cada um desses caracteres de controle e usar:
Em alguns shells (ksh93, zsh, bash, mksh pelo menos), você também pode fazer:
Para obter o último caractere de um parâmetro, POSIXly, você pode abusar dos operadores de remoção de padrão:
Em zsh ou yash, você faria:
Ou simplificado em
zsh
:Como seus arrays são arrays esparsos, e isso
$var
é a abreviação de${var[0]}
já e suporta arrays multidimensionais, o ksh93 introduziu uma sintaxe estranha para fatiamento de string ou array:bash (que não possui arrays multidimensionais, mas copiou a maior parte de seu design de array do ksh) copiou isso em 2.0.
No bash, o deslocamento também pode ser negativo para contar a partir do final (mesmo o comprimento agora desde 4.2). Porém como
${var:-default}
já é algo mais do Bourne shell, o primeiro caractere após o:
não pode ser a-
(nor+
) na expressão aritmética, então você precisa${string: -1}
de ou${string:(-1)}
ouS{string:0-1}
...ksh93 copiou isso em ksh93m, zsh também eventualmente adicionou suporte para
${var:offset[:length]}
compatibilidade com ksh (embora com ainda mais limitações, pois zsh suporta csh-style${var:modifiers}
), assim como mksh.