sentencias - sintaxis bash
Bash: anidando si en un bucle for (3)
1) La sintaxis es perfectamente legal.
2) Sí, puede anidar bloques "if / else" dentro de un bucle. También puede anidar bucles internos dentro de un bucle externo :)
3) "if [-d $ x]" comprueba si "x" es un "directorio".
Si no ve ninguna salida, entonces tal vez no tiene ningún subdirectorio?
SUGERENCIA:
abrir una ventana de terminal
Ejecute su script. Ver si obtiene o no alguna salida.
Si no es así, escriba
mkdir moose
. Esto creará un subdirectorio llamado (sin coincidencia) "alce".Vuelva a ejecutar su script. Deberías ver al menos "alce".
Soy bastante nuevo en los scripts de bash, por lo que este es probablemente un error de sintaxis estúpido, pero ¿por qué este código no funciona?
for x in $(ls)
do
if [ -d $x ]
then
echo $x
fi
done
La sección separada para y si funciona bien por sí misma, pero esto no produce salida.
Gracias.
Dos cosas. Nunca use ls
para iterar archivos, y citar las expansiones de parámetros "$x"
. La sintaxis for y if es correcta. Prefiero poner el do
y then
en la misma línea.
for file in *; do
if [[ -d "$file" ]]; then
echo "$file is a directory"
elif [[ -f "$file" ]]; then
echo "$file is a regular file"
fi
done
Para aprender bash, recomiendo leer http://mywiki.wooledge.org/BashGuide mayoría de los otros tutoriales y guías desafortunadamente no son muy buenos.
La razón para no hacer for x in $(ls)
para iterar archivos es porque for
iterar palabras y ls
genera líneas con nombres de archivo. Si esos nombres de archivo contienen espacios en blanco, esos nombres se dividirán más en palabras, por lo que estará iterando las palabras de los nombres de archivo, no los nombres de archivo. Obviamente, para los casos simples que funcionan, pero ¿por qué usar una solución a medio hacer cuando hay una forma más corta y elegante de manejar todos los casos?
Con for x in *
el shell reemplaza el *
con todos los nombres de archivo que coinciden con ese patrón en el directorio actual (llamado expansión de nombre de ruta), y cada nombre de archivo será una palabra diferente, por lo que funcionará sin importar qué caracteres contenga el nombre de archivo. Los nombres de los archivos pueden contener cualquier carácter (incluidas las nuevas líneas), excepto /
y el byte NUL (/ 0).
Vea http://mywiki.wooledge.org/ParsingLs para más información sobre eso.
En cuanto al uso de [[
vs [
. [
es un comando heredado del shell bourne, utilizado para probar cadenas, archivos y números. Bash ha agregado una [[
palabra clave más poderosa que puede hacer todo [
puede y más]. Si está escribiendo una secuencia de comandos sh, debe usar [
, pero en las secuencias de comandos bash debe usar las más poderosas [[
y ((
sintaxis). Consulte http://mywiki.wooledge.org/BashFAQ/031 para obtener más información sobre la diferencia entre [
y [[
.
Tal vez hay un problema con los caracteres que se utilizan para separar las diferentes partes de la declaración?
¿Y si lo intentaste?
for x in $(ls); do if [ -d $x ]; then echo $x; fi; done
¿Eso produce salida?