Essa é uma das razões pelas quais você precisa citar suas variáveis:
echo "${str:$i:1}"
Caso contrário, o bash expande a variável e, nesse caso, brilha antes de imprimir. Também é melhor citar o parâmetro para o script (caso você tenha um nome de arquivo correspondente):
sh lash_ch.sh 'abcde*'
Veja também a ordem das expansões no manual de referência do bash . As variáveis são expandidas antes da expansão do nome do arquivo.
Para obter o último caractere, você deve apenas usar -1
como índice, uma vez que os índices negativos contam desde o final da string:
echo "${str: -1}"
O espaço após os dois pontos ( :
) é NECESSÁRIO.
Essa abordagem não funcionará sem o espaço.
"${1: -1}"
é o suficiente.echo "${str:$((${#str}-1)):1}"
. Isso permite que você varie os caracteres finais retornados também. Este trabalho para mim no bash v4.1.0 (1)"${1:-1}
não funciona "!Por @perreal, citar variáveis é importante, mas porque li este post 5 vezes antes de encontrar uma abordagem mais simples para a questão em questão nos comentários ...
Resultado:
/
Resultado:
*
Obrigado a todos que participaram disso acima; Adicionei + 1s apropriadamente em todo o segmento!
fonte
${std: -1}
, sem o espaço isso não funcionará. Eu me deparei com isso e descobri que${std:~0}
também funciona (com ou sem espaço). Não tenho certeza se esse é um comportamento documentado, porém, não me preocupei em procurá-lo..sh
script ao tentar atribuir o caractere recuperado a uma variável. Por exemplo,declare LAST=$(echo "${str: -1}")
isso resultará na barra vermelha desagradável, mostrando um erro de sintaxe iniciando no:${str:0-1}
Eu sei que esse é um tópico muito antigo, mas ninguém mencionou qual é a resposta mais limpa para mim:
Observe que isso
-n
é apenas para que o eco não inclua uma nova linha no final.fonte
outra solução usando o script awk:
último 1 caractere:
últimos 5 caracteres:
fonte
cat file | awk '{print substr($0,length,1)}'
Obrigado!Única linha:
Agora:
fonte
echo "${str: -1}"
é suficiente (lembre-se do espaço entre:
e-
).$((...))
.Até agora, todas as respostas implicam que a palavra "shell" na pergunta equivale a Bash.
É assim que se pode fazer isso em um shell Bourne padrão:
fonte
echo -n
conforme proposto por user5394399 evita problemas quando$str
contém caracteres de formato especial.-n
mudança é um basismo. Não funcionará no shell Bourne padrão como traço, etc ... Qual foi o ponto da minha resposta.printf "%s" "$str" | ...
:-).Experimentar:
Por exemplo:
fonte
é uma boa abordagem
fonte