Estou escrevendo um utilitário Git Bash que copia uma pasta de projeto de um local para outro. Existem vários destinos para os quais o usuário pode querer copiar o projeto, embora apenas um local por execução do script seja permitido. Aqui está a lógica até agora -
#!/bin/bash
# declare and initialize variables
source="/z/files/development/xampp/code/htdocs/Project7"
targets[0]="/z/files/development/xampp/code/htdocs/test/$(date +'%Y_%m_%d')"
targets[1]="/c/users/knot22/desktop/temp_dev/$(date +'%Y_%m_%d')"
# display contents of variables to user
echo "source " $source
echo -e "\nchoice \t target location"
for i in "${!targets[@]}"; do
echo -e "$i \t ${targets[$i]}"
done
echo
# prompt user for a target
read -p "Enter target's number for this copy operation: " target
Até agora tudo bem. Em seguida, gostaria de escrever uma if
instrução que verifica se o valor para o qual o usuário digitou target
é um índice válido em targets
. Em PHP seria array_key_exists($target, $targets)
. Qual é o equivalente em Bash?
Você pode verificar se o elemento da matriz não é nulo/vazio com:
Você também precisa verificar se a resposta é um número inteiro, pois as pessoas podem responder ao prompt de leitura com uma string que será avaliada como zero e, portanto, fornecerá o primeiro elemento em sua matriz.
Você também pode considerar usar select aqui:
TL;DR Esta resposta está errada, mas explico o porquê.
Eu escrevi:
Mas isso está errado.
Em uma matriz indexada numericamente, o índice é avaliado como uma expressão aritmética. Em uma expressão aritmética, strings "nuas" são tratadas como variáveis de shell e, se a variável estiver vazia ou não definida, ela será tratada como o valor zero.
Demonstração:
Mas se houver uma variável com o mesmo nome que o valor de
$target
, então: