Я отмечаю, что правильный ответ уже был дан, но я пытаюсь обобщить в более краткий ответ.
1. Ничто не мешает вам иметь буквенную вкладкусимволы в документе here.
Чтобы ввести буквенную вкладку в командной строке Bash, вам необходимо ее избежать.Экранирующим символом является ctrl-V (если у вас нет пользовательских привязок для переопределения этого).
$ echo -n 't<ctrl-v><tab>ab' | hexdump -C
00000000 74 09 61 62 |t.ab|
00000004
В большинстве редакторов любого программиста вставка литерального символа табуляции должна быть тривиальной (хотя некоторые редакторы могут захотеть экранироватьКроме того, в Emacs ctrl-Q TAB вставляет буквенную вкладку).
Для удобочитаемости, возможно, было бы лучше использовать какой-либо вид экранирования вместо буквального символа табуляции.В Bash для этого удобен строковый синтаксис $ '...'.
2. Чтобы предотвратить расширение переменной, заключите все знаки доллара в кавычки или поставьте терминатор here doc в кавычках.
$ hexdump -C <<HERE
> t<ctrl-v><tab>\$ab
HERE
00000000 74 09 24 61 62 0a |t.$ab.|
00000006
$ hexdump -C <<'HERE'
> t<ctrl-v><tab>$ab
HERE
00000000 74 09 24 61 62 0a |t.$ab.|
00000006
В этом контексте не имеет значения, используете ли вы одинарные или двойные кавычки.
3. Я не уверен, что понимаю этот подвопрос.Цель этого документа - встроить его в скрипт.В предыдущем примере показано, как передать документ here в hexdump в сценарии или в командной строке.
Если вы хотите использовать один и тот же документ здесь несколько раз, простого способа сделать это напрямую не существует.Сценарий может записать здесь документ во временный файл, затем передать этот временный файл нескольким командам, а затем стереть временный файл.(Используйте trap
для удаления временного файла также в случае, если сценарий прерван.)
Вы также можете поместить содержимое документа here в переменную и интерполировать его.
# Note embedded newlines inside the single quotes,
# and the use of $'...\t...' to encode tabs
data=$'coffee\t$1.50
tea\t$1.50
burger\t$5.00'
# Run Word Count on the data using a here document
wc <<HERE
$data
HERE
# Count number of tab characters using another here document with the same data
grep -c $'\t' <<HERE
$data
HERE
Вы могли бы эквивалентно использовать echo -E "$data" | wc; echo -E "$data" | grep -c $'\t'
, но использование echo не очень элегантно и может быть менее переносимым (хотя, если ваша цель bash, все эхо должны быть одинаковыми. Если ваша цель - оболочка Bourne в целом, вы можететакже провести внешний процесс для каждого эха).