( Esto no es exactamente lo que preguntas, pero :)En este tipo de situaciones prefiero usarhead
$ head -z 2[0-8]_SumActive.txt
==> 21_SumActive.txt <==
Sum: 47760
Sum: 72000
Sum: 0
==> 22_SumActive.txt <==
==> 25_SumActive.txt <==
==> 28_SumActive.txt <==
Normalmente esto es lo que quieres. Si no es fácil sed
más tarde
Никогда не пытайтесь интерпретировать вывод трассировки как нечто иное, кроме как чисто информационное. Это отладочный вывод.
Тот факт, что он показывает фигурные скобки в одинарных кавычках, не означает ничего, кроме того, что оболочка интерпретировала эту конкретную строку как myval/{fix}
и ничего больше. В частности, не означает, что строка была передана в кавычках! Оболочка добавляет одинарные кавычки в вывод трассировки, потому что фигурные скобки иногда особенные, однако в данном случае они (не являются таковыми, поскольку вы никогда не используете фактическое раскрытие скобок ).
То же самое происходит здесь (работает в пустой директории):
$ echo *
+ echo '*'
*
В моей команде нет кавычек *
, поэтому оболочка попытается расширить его. Он ни во что не расширяется, поэтому остается нерасширенным. Код, создающий выходные данные трассировки, замечает, что в строке есть *
, и заключает его в кавычки. Это механическое добавление одинарных кавычек в зависимости от того, какой символ присутствует в строке, которая печатается при трассировке, это никак не влияет на команду или ее результат.
Чтобы еще раз проиллюстрировать это:
$ ls -l
total 0
-rw-r--r-- 1 kk wheel 0 Jun 14 20:15 "filename"
-rw-r--r-- 1 kk wheel 0 Jun 14 20:13 'filename'
-rw-r--r-- 1 kk wheel 0 Jun 14 20:14 *
-rw-r--r-- 1 kk wheel 0 Jun 14 20:14 **
-rw-r--r-- 1 kk wheel 0 Jun 14 20:14 123
-rw-r--r-- 1 kk wheel 0 Jun 14 20:14 file
-rw-r--r-- 1 kk wheel 0 Jun 14 20:14 long name
-rw-r--r-- 1 kk wheel 0 Jun 14 20:14 {}
$ echo *
+ echo '"filename"' ''\''filename'\''' '*' '**' 123 file 'long name' '{}'
"filename" 'filename' * ** 123 file long name {}
То есть, определенные символы в строке заставят код, создающий выходные данные трассировки, добавить кавычки вокруг этой строки в bash
. Оболочка также экранирует одинарные кавычки в строках.
Сравните это с dash
илиpdksh
:
$ echo *
+ echo "filename" 'filename' * ** 123 file long name {}
"filename" 'filename' * ** 123 file long name {}
Эти конкретные оболочки не добавляют кавычки (и не экранируют одинарные кавычки ). Это действительно не имеет значения, это просто вывод отладки.
Всегда раскрывать переменные в двойных кавычках,если вы явно не хотите, чтобы оболочка выполняла разбиение слов -и генерацию имени файла (подстановку )в строках.
Двойные кавычки не всегда необходимы , но легче всегда помнить о двойных кавычках, чем запоминать контексты, в которых это не нужно.
Ваш скрипт, исправлен:
#!/bin/bash
A=myval
B="$A/{fix}"
C="$A/fix"
set -xT
printf '%s\n' "$B"
printf '%s\n' "$C"
Это обеспечит вывод значений $B
и $C
на стандартный вывод независимо от их значений. В вашем исходном коде, если $A
было *
, использование $B
и $C
без кавычек могло привести к некоторым совпадающим именам файлов.
Обратите внимание, что выходные данные трассировки по-прежнему будут заключать в кавычки строку myval/{fix}
с этим кодом. Не волнуйтесь, это ничего не значит, это просто оболочка, пытающаяся помочь своим отладочным выводом.
Связанные: