Как отображать переменные без кавычек в сценарии bash?

( 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 sedmás tarde

2
14.06.2019, 19:25
1 ответ

Никогда не пытайтесь интерпретировать вывод трассировки как нечто иное, кроме как чисто информационное. Это отладочный вывод.

Тот факт, что он показывает фигурные скобки в одинарных кавычках, не означает ничего, кроме того, что оболочка интерпретировала эту конкретную строку как 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}с этим кодом. Не волнуйтесь, это ничего не значит, это просто оболочка, пытающаяся помочь своим отладочным выводом.

Связанные:

8
27.01.2020, 21:53

Теги

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