Вложение $ {name: offset: length} и ​​$ () в zsh - PullRequest
0 голосов
/ 10 февраля 2020

В zsh, $() позволяет мне запустить команду в скобках и получить стандартный вывод, а ${name:offset:length} позволяет мне получить подстроку имени переменной. Как я могу вкладывать первое в последнее? В качестве конкретного примера справедливо следующее:

base=$(basename $HOME)              # basename of user home directory -- temporary
user3=${base:0:3}                   # first three letters of $base

Но можно ли добиться того же самого, не определяя временное?

Я знаю, что user3=$(basename $HOME | cut -c 1-3) справится, но я ищу решение, которое не использует вырезать.

1 Ответ

3 голосов
/ 10 февраля 2020

Двойные кавычки вокруг подстановки команд должны работать:

user3=${"$(basename $HOME)":0:3}

Хотя я бы предпочел использовать модификатор zsh ':t вместо базового имени:

${${HOME:t}:0:3}

Форма :offset:length действительно существует только для совместимости bash. Если у вас может быть старая версия zsh, вы также можете использовать нижнюю форму:

${${HOME:t}[0,3]}
...