Preciso criar um script de shell que verifique a presença de um arquivo e, se ele não existir, o crie e avance para o próximo comando ou apenas avance para o próximo comando. O que eu tenho não faz isso.
#!/bin/bash
# Check for the file that gets created when the script successfully finishes.
if [! -f /Scripts/file.txt]
then
: # Do nothing. Go to the next step?
else
mkdir /Scripts # file.txt will come at the end of the script
fi
# Next command (macOS preference setting)
defaults write ...
O retorno é
line 5: [!: command not found
mkdir: /Scripts: File exists
Não tenho ideia do que fazer. Todo lugar que uma pesquisa no Google me traz indica algo diferente.
bash
shell-script
osx
jrw
fonte
fonte
touch
o arquivo e pular o condicional?[
e!
), mas provavelmente é útil destacar aqui que[
é um comando real no Unix. Um comando Unix requer algum espaço em branco entre o nome do comando e seus argumentos. Sim, é um Bash embutido , também, mas há também um binário de/usr/bin/[
na maioria dos sistemas.Respostas:
Solução possivelmente mais simples, sem necessidade de fazer testes explícitos, basta usar:
Se você não deseja que o tempo "modificação" de uma já existente
file.txt
a ser alterado portouch
, você pode usartouch -a /Scripts/file.txt
para fazertouch
só mudam o "acesso" e os tempos de "mudança".fonte
>>/Scripts/file.txt
. Isso abrirá o arquivo para anexar e o criará, se ele não existir.Você está recebendo o erro porque não há espaço entre eles
[
e,!
no entanto, também existem algumas falhas no seu código. Primeiro você está verificando se o arquivo não existe e, se não, não está fazendo nada. Se o arquivo existir, você estará criando um diretório (mas não fazendo nada para criar o arquivo).Você também não precisa da operação nula; você pode simplesmente fazer:
Isso está verificando se
/Scripts/file.txt
não existe, ele criará o/Scripts
diretório e ofile.txt
arquivo. Você também pode verificar a existência do diretório separadamente, se desejar. Além disso, observe que estou usando, em-e
vez de o-f
que você pediu, simplesmente para verificar a existência de um arquivo que é o que-e
fará quando-f
verifica se ele é um "arquivo regular" http://tldp.org/LDP/abs/html/fto. htmlfonte
Para começar, o shell script não é um script bash , então vamos tornar seu código mais geral:
Todo sistema Posix deve ter esse arquivo; bash é estritamente opcional.
Não há necessidade de testar se o diretório existe, apenas
Para criar o arquivo, se ele não existir,
Ou se você preferir,
fonte
Você tem um erro sintático. Você precisa de espaços antes e depois do
[
e]
.fonte
O que foi dito acima pressupõe que não há "truques", como criar um diretório chamado
/Scripts/file.txt
(que pode ser uma maneira de forçar o script a sempre inserir a ramificação if). Se o "arquivo" for um diretório, o teste -f falhará e o comando touch não mudará nada.fonte
minha abordagem
resultado
.
fonte
touch
emkdir -p