Este script debe copiar todos los archivos cuyos nombres se proporcionan como argumentos en la línea de comando al directorio de inicio del usuario. Si no se han proporcionado archivos, el script debe usar lectura para solicitar nombres de archivos y copiar todos los nombres de archivos proporcionados en la respuesta al directorio de inicio del usuario.
if [ -z $1 ]
then
echo provide filenames
read $FILENAMES
else
FILENAMES="$@"
fi
echo the following filenames have been provided: $FILENAMES
for i in $FILENAMES
do
cp $i $HOME
done
Si proporciono argumentos como una cadena, funciona. Pero si proporciono "leer $FILENAMES", no funciona.
Mentor muestra la misma solución en sus lecciones pero no muestra cómo funciona.
ACTUALIZACIÓN Después de ingresar los nombres de los archivos como argumentos, aparecen cadenas vacías y no copié los archivos a la ubicación $HOME
[dmytro@oc1726036122 ~]$ cd Desktop/
[dmytro@oc1726036122 Desktop]$ . totmp
provide filenames
one two
the following filenames have been provided:
the following filenames have been provided:
[dmytro@oc1726036122 Desktop]$
Respuesta1
El read
declara variables en lugar de leerlas. En pocas palabras, retira el $
y read
listo.
if [ -z $1 ]
then
echo provide filenames
read FILENAMES
else
FILENAMES="$@"
fi
echo the following filenames have been provided: $FILENAMES
for i in $FILENAMES
do
cp $i $HOME
done
EDITAR: Veo que usas el comando source
( .
) para ejecutar un script.
[dmytro@oc1726036122 Desktop]$ . totmp
Puede que esté bien para este script en particular, pero nunca lo hagas con scripts complejos. De lo contrario, obtienes cualquier variable o función de ese script en tu Shell. Solo usabash totmp
Respuesta2
El problema que parece estar bloqueándote es que el read
comando es incorrecto, el argumento que se le pasa debe ser un nombre de variable y, por lo tanto, debe pasarse sin $
( $
expandirá el contenido de la variable, que estará vacía en ese punto). , por lo que el resultado es read
sin ningún nombre de variable pasado).
read FILENAMES
Hay otro problema con la comprobación de la ausencia del primer argumento de la línea de comandos. Si no está presente, $1
se expandirá a nada (no a una cadena vacía), lo que podría causar problemas con el [
comando, ya que [ -z ]
en realidad no se supone que sea válido, [ -z "" ]
es lo que esperaría verificar en ese caso. En resumen, es necesario citar esa variable:
if [ -z "$1" ]
Como estás usando bash, también puedes usar [[ ... ]]
, que generalmente es mejor ya que es un comando interno (en ese caso, este comando debería funcionar sin comillas, pero mantener las comillas no hace daño y se ve bien).
(PD: hay muchos más errores en este script, está muy lejos de las mejores prácticas, estoy realmente consternado al ver a alguien enseñar esto. Desafortunadamente, parece que el listón es muy bajo para enseñar bash y los manuales son realmente complejos hasta realmente lo entiendes bien, así que tampoco sé si tendría una mejor recomendación sobre cómo aprenderlo correctamente).☹️
Respuesta3
El read
comando toma la variable, pero ya te estás refiriendo a los valores de la variable:
#correct syntax
read variable
#wrong syntax
read $variable
$variable
es el valor de variable
y al comienzo del script esto está desarmado/vacío.