Другое решение awk:
awk '{l=length($1); print substr($1,1,1) l-2 substr($1,l,1)}'
l=length($1)
-Задайте для переменной l
длину вашей строки (Предполагая, что входная строка находится в первом столбце и не содержит пробелов)substr($1,1,1)
-(столбец #, начальная точка, конечная точка ), поэтому напечатайте столбец 1, начиная с позиции 1, и напечатайте 1 символ.l-2
-Длина строки минус 2substr($1,l,1)
-Напечатать столбец 1, начиная с позиции l
(, длину строки )и напечатать 1 символ. Это Разбиение слов в действии. Прежде чем мы начнем, просмотрите Расширения оболочки , обращая внимание на порядок, в котором они выполняются.
Глядя наnode -p "console.log($(echo \"hello world\"))"
расширение скобки? нет
расширение тильды? нет
расширение параметра? здесь нет
подмена команды? да, оставив тебя с
node -p "console.log("hello world")"
арифметическое расширение? нет
замена процесса? нет
разбиение на слова? аргумент -p
в кавычках, так что нет.
расширение имени файла? нет
удаление кавычек выполнено
bash порождает node
, передавая ему 2 аргумента, -p
иconsole.log("hello world")
Теперь посмотрите наnode -p console.log($(echo \"hello world\"))
после подстановки команд имеемnode -p console.log("hello world")
когда мы доходим до разделения слов, аргумент -p
не имеет кавычек для его защиты. Для текущей команды bash имеет 4 токена:
node -p console.log("hello world")
^^^^ ^^ ^^^^^^^^^^^^^^^^^^ ^^^^^^^
bash порождает node
передает его 3 аргумента :-p
, console.log("hello
иworld")
--console.log("hello
явно является синтаксической ошибкой javascript, и вы видите, что происходит.
Более подробно см. Последствия для безопасности, если забыли заключить переменную в кавычки в оболочках bash/POSIX
Я не знаю, что должен делать "узел -p" в вашем примере. Но попытка воспроизвести ваш пример приводит к следующему:
[user@c0n1 ~]# echo "hello world"
hello world
[user@c0n1 ~]# echo $(\"hello world\")
-bash: "hello: command not found
Пробел в последнем примере разрывает строку внутри кавычек, и bash считает, что «hello» — это команда. Защита пробела обратной косой чертой подтверждает это объяснение:
[user@c0n1 ~]# echo $(\"hello\ world\")
-bash: "hello world": command not found
Если вы пытаетесь создать строку внутри подстановки команд, вам нужна команда для ее выполнения, например:
[user@c0n1 ~]# echo $(echo \"hello world\")
"hello world"