Eu estou tentando escrever um script extremamente simples no Ubuntu que me permita passar um nome de arquivo ou um diretório e ser capaz de fazer algo específico quando é um arquivo e outra coisa quando é um diretório. O problema que estou tendo é quando o nome do diretório, ou provavelmente arquivos também tem espaços ou outros caracteres escapable estão no nome.
Aqui está o meu código básico abaixo e alguns testes.
#!/bin/bash
PASSED=$1
if [ -d "${PASSED}" ] ; then
echo "$PASSED is a directory";
else
if [ -f "${PASSED}" ]; then
echo "${PASSED} is a file";
else
echo "${PASSED} is not valid";
exit 1
fi
fi
E aqui está a saída:
andy@server~ $ ./scripts/testmove.sh /home/andy/
/home/andy/ is a directory
andy@server~ $ ./scripts/testmove.sh /home/andy/blah.txt
/home/andy/blah.txt is a file
andy@server~ $ ./scripts/testmove.sh /home/andy/blah\ with\ a\ space.txt
/home/andy/blah with a space.txt is not valid
andy@server~ $ ./scripts/testmove.sh /home/andy\ with\ a\ space/
/home/andy with a space/ is not valid
Todos esses caminhos são válidos e existem.
if
-else
construções em Bash também suportamelif
. Apenas para sua informação.Respostas:
Isso deve funcionar. Não sei por que está falhando. Você está citando suas variáveis corretamente. O que acontece se você usar esse script com o dobro
[[
]]
?Os colchetes duplos são uma extensão do bash para
[ ]
. Não requer que as variáveis sejam citadas, nem mesmo se elas contiverem espaços.Também vale a pena tentar:
-e
testar se existe um caminho sem testar que tipo de arquivo é.fonte
Pelo menos escreva o código sem a árvore espessa:
Quando coloco isso em um arquivo "xx.sh" e crio um arquivo "xx sh" e o executo, recebo:
Como você está tendo problemas, você deve depurar o script adicionando:
Isso mostrará o que você
ls
pensa sobre os nomes que você passa no script.fonte
O uso do comando "arquivo" pode ser útil para isso:
Exemplos de saída:
Para sua informação: as respostas acima funcionam, mas você pode usar -s para ajudar em situações estranhas, verificando primeiro um arquivo válido:
fonte
-s
verifica um arquivo não vazio, um com tamanho diferente de zero)? E você não imprimirá nenhum diagnóstico para um bloco especial, caractere especial, FIFO, etc? Os links simbólicos provavelmente resolvem o que está no outro extremo do link; links simbólicos quebrados são mais problemáticos.--brief
bandeira defile
. Apenas produzdirectory
quando é.Usando
-f
e-d
ativando/bin/test
:fonte
test
É normalmente um invólucro interno, embora haja geralmente também é um executável, tais como/bin/test
, e também/bin/[
.)Uma solução mais elegante
fonte
if [ -f "$x" ]
.fonte
Isso deve funcionar:
fonte
fonte
Um forro
o resultado é verdadeiro (0) (dir) ou verdadeiro (0) (arquivo) ou falso (1) (nenhum)
fonte
touch bob
pormkdir bob
, recebo a saída:dir
efile
em duas linhas.