${... }
(las llaves )marcan varios tipos de expansión de parámetros , la más simple de las cuales es simplemente expandir el valor de una variable. Lo que está dentro de las llaves en su código no es un nombre de parámetro válido, ni ninguna otra expansión, por lo que el shell se queja.
Parece que desea la sustitución de comandos en su lugar, para eso, la sintaxis es$(... )
(paréntesis regular ).
Además, ls
en ls $filename | sed...
parece un poco innecesario, la variable se expande a su nombre de archivo y ls
simplemente lo pasa. Podría usar echo "$filename" | sed...
en su lugar.
Dicho esto, podrías hacer esas modificaciones directamente en el shell:
no="${filename/assemblyDB.}" # remove first match
no="${no/.las}"
o, utilizando los operadores estándar:
no="${filename#assemblyDB.}" # remove from start of string
no="${no%.las}" # remove from end of string
Si ejecuta sed
, es posible que desee tener en cuenta que .
coincide con cualquier carácter en las expresiones regulares, por lo que sería más correcto citarlo con una barra invertida. También puede dar una instancia sed
de ambos comandos:sed -e 's/assemblyDB\.//' -e 's/\.las//'
.
Y luego for filename in $(find. -type f -name "assemblyDB.*.las"); do
tiene todos los problemas que tiene analizar ls , principalmente el hecho de que los espacios en blanco y los comodines en los nombres de archivo lo romperán. En ksh/Bash/zsh, podría hacer todo ese bucle en el shell:
shopt -s globstar # in Bash
for filename in **/assemblyDB.*.las; do
...