El script bash simple no funciona

El script bash simple no funciona

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. ingrese la descripción de la imagen aquí

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 readdeclara variables en lugar de leerlas. En pocas palabras, retira el $y readlisto.

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 readcomando 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 readsin 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, $1se 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 readcomando toma la variable, pero ya te estás refiriendo a los valores de la variable:

 #correct syntax
 read variable
 #wrong syntax
 read $variable

$variablees el valor de variabley al comienzo del script esto está desarmado/vacío.

información relacionada