Construção de vetor flexível no tcsh

2

a geração de vetores é uma técnica que nos permite gerar listas sem definir iteradores e gravar loops. Eles são úteis em muitas situações e podem tornar o código muito mais sucinto e compacto. Eles também facilitam a composição rápida de construções mais complexas via command expansion .

Aqui está um exemplo: Eu tenho um programa que opera em vários argumentos do host. Eu preciso gerar uma lista de nomes de host que tenham um número sequencial incorporado neles, por exemplo:

a1z a2z a3z a4z a5z

Em bash , pode escrever:

$ progname a{1..5}z

que será expandido para:

$ progname a1z a2z a3z a4z a5z

Em tcsh , que não possui esse recurso útil de geração de vetores de argumentos, às vezes podemos usar seq . Infelizmente, seq está limitado apenas a números. man seq diz que seq suporta um argumento --format , mas não parece fazer a coisa realmente útil (permitindo formatos arbitrários incluindo um número). Em vez disso, ele suporta apenas alterar o formato de ponto flutuante de um número sozinho (uma pena).

É claro, podemos delegar a expansão para bash + echo usando command expansion e citando o argumento bash -c completo:

tcsh> progname 'bash -c "echo a{1..5}z"'

Da mesma forma, poderíamos delegar a geração do vetor de seqüência de caracteres a utilitários grandes como awk , perl , python , lisp ou R usando '' (expansão de comando) .

A questão é: existem outras maneiras simples para gerar esses vetores em tcsh . Por 'simples' eu quero dizer um pequeno utilitário como seq , ou melhor ainda, uma construção de shell embutida, e sem recorrer a escrever loops ou delegar a geração de vetores para programas "grandes" como bash/awk/clisp/perl/python/R ?

    
por arielf 08.04.2013 / 23:45

1 resposta

2

Você pode canalizar a saída de seq .

progname 'seq 5 | sed -e 's/^/a/' -e 's/$/z/''

Você pode usar a substituição de histórico para adicionar um prefixo a todos os elementos de uma matriz:

set a = ('seq 5')
progname ${a:s//a/}

Eu não sei como adicionar um sufixo, mas não sou especialista em tcsh.

Tcsh está meio que morto neste século, e até mesmo antes era amplamente reconhecido como menos adequado para o script do que para o estilo Bourne. Que tal usar o zsh?

a=($(seq 5))
progname a${^a}z
    
por Gilles 09.04.2013 / 00:16