listar arquivos e armazená-los em variáveis

listar arquivos e armazená-los em variáveis

Sou novo em programação shell. Meu objetivo é dar ao usuário uma seleção de qual arquivo deve ser executado. Eu pego todos os scripts disponíveis em uma var com:

var=$(find script*)

até aí tudo bem, esta é a saída:

    echo $var
    script1 script2 script3 scr...

agora quero armazenar cada arquivo em uma variável única para executá-lo em uma seleção posterior

select SEL in script1 script2 script3 ..........
case $SEL in
        $Script1) echo ($Script1 will start) && ./$script1 ;;
        $Script2) echo ($Script2 will start) && ./$script2 ;;
        $Script3) echo ($Script3 will start) && ./$script3 ;;
        $Sc..) echo ($Scr.... will start) && ./$scrip.... ;;
        $Sc...) echo ($Sc...... will start) && ./$scrip..... ;;
        *) echo "choose on of the availabel files";;
    esac
done

Não tenho ideia de como devo separar todos os arquivos se não sei quantos e o comprimento exato de cada arquivo.

Tentei dividir com echo ${var[1]} e echo $var[1] mas não funcionou. Recebo uma saída vazia ou a string inteira.

Responder1

Sua primeira linha:

var=$(find script*)

está apenas criando varuma única variável de string com tudo script*isso. Isso énãoum array, então não podemos indexá-lo []como você deseja.

Na verdade, o script*é expandido pelo shell, então findnão está fazendo nada lá (a menos que sejam diretórios, o que não parece ser) - apenas obtém todos os nomes de arquivos como argumentos, verifica se eles existem e os imprime diretamente volte novamente. O shell realmente faz todo o trabalho.

Em vez disso, podemos fazer umavariedade, e podemos usar o shellexpansão globaldiretamente para preenchê-lo:

files=(script*)

Quando colocamos o inicializador (o lado direito do =) entre parênteses, estamos criando um array, que contém vários valores separadamente. script*será expandido para todos os nomes de arquivo começando scriptno diretório atual. Se houver espaços nos nomes dos arquivos, eles não farão com que as palavras sejam divididas da maneira que seriam com comandos (crases ou $()) dentro do inicializador do array.

Neste ponto, podemos ler algumas entradas do usuário:

select SEL in "${files[@]}"
do
    if ! [ "$SEL" ]
    then
        echo "Choose one of the available files."
        continue
    fi
    echo "$SEL will start"
    "./$SEL"
    break
done

Escrevemos "${files[@]}"para expandir toda a nossa gama de nomes de arquivos para fornecer a select. Será oferecida ao usuário uma escolha de arquivos e então entraremos no do...donebloco.

Se $SELestiver vazio, o usuário escolheu uma entrada inexistente, então imprimimos o prompt e continueele é solicitado a escolher novamente.

Caso contrário, receberemos echoa notificação de que o script será iniciado e executado. Citamos o nome "./$SEL"caso o nome do script contenha espaços, o que de outra forma faria com que o nome do comando fosse tratado como ./firstword, com as palavras restantes como argumentos. breaknos impede de voltar e perguntar ao usuário novamente; se você quiser fazer isso, tire-o.


O que case...ofvocê estava usando não parece ter muito efeito no exemplo que você deu, mas se você tiver algum comportamento separado dependendo do script escolhido (e tem que estar emessescript), você pode colocar isso dentro do do...donebloco.

Responder2

Não tenho 100% de certeza se entendi completamente o que você quer fazer, mas isso pode funcionar melhor para você: em vez de var=$(find script*) e um caso que você poderia usar melhor

for i in `find script*`
do
        echo ($i will start) 
        ./$i
done

informação relacionada