J'essaie d'écrire un script extrêmement simple dans Ubuntu qui me permettrait de lui passer un nom de fichier ou un répertoire, et être capable de faire quelque chose de spécifique quand c'est un fichier, et autre chose quand c'est un répertoire. Le problème que je rencontre est lorsque le nom du répertoire, ou probablement des fichiers aussi, a des espaces ou d'autres caractères échappables sont dans le nom.
Voici mon code de base ci-dessous et quelques tests.
#!/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
Et voici la sortie:
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
Tous ces chemins sont valides et existent.
if
- Leselse
constructions dans Bash prennent également en chargeelif
. Juste FYI.Réponses:
Cela devrait fonctionner. Je ne sais pas pourquoi cela échoue. Vous citez correctement vos variables. Que se passe-t-il si vous utilisez ce script avec double
[[
]]
?Les doubles crochets sont une extension bash de
[ ]
. Il n'est pas nécessaire que les variables soient entre guillemets, même si elles contiennent des espaces.Il vaut également la peine d'essayer:
-e
pour tester si un chemin existe sans tester de quel type de fichier il s'agit.la source
Au moins écrivez le code sans l'arbre touffu:
Lorsque je mets cela dans un fichier "xx.sh" et que je crée un fichier "xx sh" et que je l'exécute, j'obtiens:
Étant donné que vous rencontrez des problèmes, vous devez déboguer le script en ajoutant:
Cela vous montrera ce
ls
que vous pensez des noms que vous passez le script.la source
L'utilisation de la commande "fichier" peut être utile pour cela:
Exemples de sortie:
Pour info: les réponses ci-dessus fonctionnent, mais vous pouvez utiliser -s pour aider dans des situations étranges en vérifiant d'abord un fichier valide:
la source
-s
vérifie un fichier non vide, un avec une taille non nulle)? Et vous n'imprimerez aucun diagnostic pour un bloc spécial, un caractère spécial, un FIFO, etc.? Les liens symboliques se résolvent probablement à ce qui se trouve à l'extrémité du lien; les liens symboliques rompus sont plus problématiques.--brief
drapeau defile
. Il sort simplementdirectory
quand c'est le cas.Utilisation
-f
et mise en-d
marche/bin/test
:la source
test
est normalement un shell intégré, bien qu'il y ait généralement aussi un exécutable tel que/bin/test
, et aussi/bin/[
.)Une solution plus élégante
la source
if [ -f "$x" ]
.la source
Cela devrait fonctionner:
la source
la source
Bon mot
le résultat est vrai (0) (dir) ou vrai (0) (fichier) ou faux (1) (ni l'un ni l'autre)
la source
touch bob
parmkdir bob
, j'obtiens la sortie:dir
etfile
sur deux lignes.