Sua primeira linha:
var=$(find script*)
está apenas transformando var
em uma única variável de string com todo script*
nela. Não é não um array, então não podemos indexar nele com []
como você deseja.
O script*
é realmente expandido pelo shell, então find
não está fazendo nada lá (a menos que sejam diretórios, o que não parece que sejam) - ele apenas recebe todos os nomes de arquivos como argumentos , verifica se eles existem e os imprime de volta. A casca realmente faz todo o trabalho ..
Em vez disso, podemos criar um array e podemos usar o
files=(script*)
Quando colocamos o inicializador (o lado direito do =
) entre parênteses, criamos um array, que contém vários valores separadamente. script*
expandirá para cada nome de arquivo, começando com script
no diretório atual. Se houver espaços nos nomes de arquivos, eles não farão com que as palavras sejam divididas do jeito que seriam com os comandos (backticks ou $()
) dentro do inicializador da matriz.
Neste ponto, podemos ler alguma entrada 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 matriz de nomes de arquivos para dar a select
. Serão oferecidos ao usuário uma opção de arquivos e, em seguida, inseriremos o bloco do...done
.
Se $SEL
estiver vazio, o usuário escolheu uma entrada inexistente, por isso, imprimimos o prompt e continue
, para que eles peçam para escolher novamente.
Caso contrário, echo
a notificação de que o script será iniciado e executará o script. Citaremos o nome "./$SEL"
caso o nome do script tenha espaços, o que faria com que o nome do comando fosse tratado como ./firstword
, com as palavras restantes como argumentos. break
nos impede de voltar e perguntar ao usuário novamente; se você quiser fazer isso, retire-o.
O case...of
que você estava usando não parece ter muito efeito no exemplo que você dá, mas se você tiver algum comportamento separado, dependendo do script escolhido (e tem que estar em isso script), você pode colocar isso dentro do bloco do...done
.