Estou fazendo um script de shell de modelo para um projeto, uma função que é obrigatória é a capacidade de fazer uma cópia de um arquivo de configuração de modelo como um novo arquivo. No entanto, isso não será tratado estaticamente, eu crio e defino uma variável de tempo de execução ( $modloader
) que vem do nome do arquivo de scripts de shell e copia o modelo com esse mesmo nome. Fiz alguns testes com nomes de arquivos estáticos e cp
funciona bem, mas parece desmoronar ao verificar se o arquivo já está presente (linha 5) . Se eu executar isso no terminal, ele não vê o arquivo que está verificando. Acredito que esteja procurando em um contexto mais literal e não 'entende' que está usando uma variável.
#!/bin/sh
modloader=`basename -s .sh "$0"`
if "./Settings/$modloader.ini"; then
cp "./Settings/Template.ini" "./Settings/$modloader.ini"
fi
Não vejo que você esteja verificando se o arquivo já está presente. Suas
if "./Settings/$modloader.ini";
tentativas de executar o arquivo ini. Em geral pode ser um teste válido para algo, se o arquivo for projetado para ser executado assim e retornar o status de saída de acordo com o que você deseja testar.Mesmo que a execução do arquivo em questão fosse possível, não faria sentido fazer do arquivo um testador de sua própria (in)existência.
O caminho certo em um shell para saber se o arquivo existe é:
Notas:
test -e
testes para um arquivo de qualquer tipo .test -e
ou tal lhe dará um falso negativo (ou seja, status de saída diferente de zero) se as permissões para algum diretório relevante (por exemploSettings
, no seu caso) não permitirem verificar se o arquivo existe.Além disso, você deseja negar o teste. A linha do seu código ficaria assim:
if
não é necessário embora. GNUcp
com-n
(--no-clobber
) pode ser tudo que você precisa no lugar desteif … fi
seu. A opção não é portátil e você provavelmente deseja outra opção não portátil-T
(--no-target-directory
) caso o destino seja (um link simbólico para) um diretório.Observe se o destino já existe e, portanto,
cp -n
não é operacional, o status de saída será0
. Você obterá o mesmo status de saída se o destino não existir e a cópia for bem-sucedida. Isso significa que se você quiser fazer mais (do quecp
) dependendo se o arquivo existia ou não, você precisa antes deif
qualquer maneira.