Analisar a saída de ls é uma má ideia (a saída de ls é estritamente para olhar). Para mais informações, consulte a pergunta " Por que * not * pars 'ls'? ".
É assim que você pode fazer isso em /bin/sh :
for filename in t-*-*.c; do
[ ! -f "$filename" ] && continue
number=${filename#t-} # remove "t-" from start of filename
number=${number%%-*} # remove everything from first "-" in what remains
printf '%s\n' "$number"
done
Isso iterará todos os nomes de arquivos no diretório atual cujo nome corresponda ao padrão t-*-*.c . Para cada um desses nomes, o t- bit é retirado do início e, em seguida, o segundo - e tudo depois é removido com outra expansão de parâmetro.
A expansão ${variable#word} removeria a correspondência (mais curta) de word do início de $variable , enquanto ${variable%%word} removeria a correspondência (mais longa) de word do o fim da string.
Com bash , usando a expressão regular correspondente nos nomes dos arquivos:
for filename in t-*-*.c; do
[ ! -f "$filename" ] && continue
if [[ "$filename" =~ ^t-([0-9]+)- ]]; then
printf '%s\n' "${BASH_REMATCH[1]}"
fi
done
Isso corresponderia e capturaria os dígitos após t- em cada nome de arquivo. O grupo de dígitos capturado está disponível em ${BASH_REMATCH[1]} após uma correspondência bem-sucedida. O índice 1 refere-se ao primeiro grupo de captura (parênteses) na expressão regular.
Para uma solução lenta, mas possivelmente confortável (como em "familiar"), convém chamar um comando externo para analisar o bit da string em que você está interessado:
for filename in t-*-*.c; do
[ ! -f "$filename" ] && continue
cut -d '-' -f 2 <<<"$filename"
done
Isso pressupõe bash e você pode chamar cut em um loop. Isso seria muito mais lento do que usar a operação embutida no próprio shell. O comando cut aqui é solicitado a retornar o segundo campo - -delimited da string passada para ele a partir de bash (usando um redirecionamento "here-string").