Проблема с использованием команды чтения в цикле чтения

Возможно из-за ошибки при определении пути к файлу, который нужно удалить.

Ваш случай напомнил мне прекрасный день, когда мой самодельный метод remove (path) пытался удалить корневую папку, потому что данный параметр был пустой строкой, которую ОС исправила (!) Как корневую папку.

Это может быть похожая ошибка git. Так, что:

  1. Команда Rebase хотела удалить файл типа remove (project_folder + file_path) (псевдокод)
  2. Каким-то образом file_path в то время был пустым.
  3. Команда оценивается как что-то вроде remove (project_folder)
3
10.02.2018, 11:42
2 ответа

El segundo readdentro del cuerpo del ciclo es incorrecto aquí. En realidad, va una línea por delante de su primera llamada readcomo parte del ciclo while. Entonces, para su requerimiento, simplemente lea esas variables como parte del primerread

while read -r path1 path2; do
    echo "$path1"
    echo "$path2"
done < "$1"

Como puede ver aquí, la configuración IFS=también es incorrecta cuando se leen dos variables porque, al restablecer el separador de campo, la línea se toma como un todo. Al tener su valor predeterminado (caracteres de espacio en blanco -de espacio, tabulador y nueva línea ), la lectura de dos variables almacenará los valores de cada línea en una lista separada por espacios. De esta manera podríamos tener n -líneas delimitadas por columnas y usar n variables para leer.

Ahora los valores están disponibles en aquellas variables que puede pasar a otros comandos según sea necesario.

Veamos cómo funciona esto para un archivo de entrada de muestra

foo bar
foo1 bar1
foo2 bar2

Ejecutar el primer script en modo de depuración con -xconfigurado

$ bash -x script.sh
+ read -r path1 path2
+ echo 1
1
+ echo 2
2
+ read -r path1 path2
+ echo 3
3
+ echo 4
4
+ read -r path1 path2
+ echo abc
abc
+ echo def
def
+ read -r path1 path2
3
27.01.2020, 21:21

Con la redirección del archivo al bucle for, todas las lecturas de la entrada estándar en todo el bucle se leerán del mismo archivo. Esto significa que los dos comandos readen el ciclo leerán líneas alternativas de cualquier archivo que pase como primer argumento a su script.

No me queda claro de dónde quiere que provengan los datos para path1y path2. Si se van a leer desde el archivo, simplemente hágalo en el encabezado del bucle:

while read -r path1 path2; do
    printf 'path1 = "%s"\n' "$path1"
    printf 'path2 = "%s"\n' "$path2"
done <"somefile"

El resto de esta respuesta asume que desea leer algo del archivo y luego, en el bucle, desde la terminal.

Para hacer que readen el cuerpo del ciclo se lea desde el terminal:

exec 3<"somefile"

while IFS= read -r words <&3; do
   read -r word1 word2 junk
   printf 'Got words = "%s"\n' "$words"
   printf 'Got word1 = "%s"\n' "$word1"
   printf 'Got word2 = "%s"\n' "$word2"
done

Esto hace que la entrada al primero readprovenga del archivo somefilemientras que el flujo de entrada estándar del segundo readse leerá desde la terminal (o de donde provenga el flujo de entrada estándar del script ).

0
27.01.2020, 21:21

Теги

Похожие вопросы