Почему при печати переменной, содержащей символы новой строки, удаляется последняя новая строка? [дубликат]

Если у вас может быть только один раздел, это говорит о том, что у вас нет таблицы разделов: вы просто используете необработанный диск. Я просмотрел Таблица разделов: цикл и нашел много вещей, которые, кажется, подтверждают, что вы используете необработанное устройство.

Должна быть возможность переместить файловую систему и вставить таблицу разделов, указывающую на нее как на первый раздел. Затем вы можете перейти к добавлению другого раздела и т. Д.

Однако я подозреваю, что вероятность того, что вы не удаляете свои данные, близка к нулю. Если у вас есть другое маленькое устройство, вы можете попрактиковаться несколько раз, но если реальность будет отличаться от практики, ваши данные могут исчезнуть.

Я проделал это однажды, и был в горячем поту, и он часами ломался, прежде чем он заработал. В другой раз я случайно переписал данные.

9
31.05.2018, 00:55
1 ответ

No es la impresión, es la sustitución del comando lo que hace eso. Está definido para hacer eso. De la descripción POSIX :

The shell shall expand the command substitution by executing command in a subshell environment and replacing the command substitution with the standard output of the command, removing sequences of one or more {newline} characters at the end of the substitution.

Tenga en cuenta que elimina todos los saltos de línea finales, no solo uno.

En un caso algo común, usaría la sustitución de comandos para capturar una salida de una -línea, digamos osrev=$(uname -r). Las utilidades generalmente imprimen una nueva línea final, para comodidad del usuario en la línea de comando. Pero en un script de shell, es posible que desee usar esa cadena como parte de otra, digamos un nombre de archivo:filename=blahblah-$osrev.dat. Y en ese caso, la nueva línea final solo sería una molestia.

Y, por supuesto, una simple echoagregará una nueva línea final en cualquier caso.


Si desea el contenido del archivo como -está en la variable, entonces la solución común es agregar un carácter adicional en la sustitución del comando y eliminarlo más tarde:

printf "foo\nbar\n\n" > file
string=$(cat file; echo x)
string=${string%x}
printf '%q\n' "$string"

que genera $'foo\nbar\n\n', mostrando las dos nuevas líneas finales presentes.


Dependiendo de lo que pretenda hacer con los datos, puede haber otras formas. P.ej. un bucle while read, o el mapfilede Bash, si desea procesar el archivo línea -por línea -.

25
27.01.2020, 20:04

Теги

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