Можно ли вкладывать выражения расширения $ {var} в bash? - PullRequest
55 голосов
/ 27 мая 2009

Что у меня есть это:

progname=${0%.*}
progname=${progname##*/}

Может ли это быть вложено (или нет) в одну строку, то есть в одно выражение?

Я пытаюсь убрать путь и расширение из имени скрипта, чтобы осталось только базовое имя. Выше две строки работают нормально. Моя природа «С» просто заставляет меня запутывать их еще больше.

Ответы [ 14 ]

0 голосов
/ 01 мая 2019

Это сработает, если вы будете следовать приведенному ниже способу выполнения промежуточного шага:

export HELLO="HELLO"
export HELLOWORLD="Hello, world!"

varname=${HELLO}WORLD
echo ${!varname}
0 голосов
/ 21 июня 2018

Хотя это очень старая тема, это устройство идеально подходит для прямого или случайного выбора файла / каталога для обработки (воспроизведения мелодий, выбора фильма для просмотра или книги для чтения и т. Д.).

В bash я считаю, что в общем случае верно, что вы не можете напрямую вкладывать любые два расширения одного и того же типа, но если вы можете разделить их каким-либо другим видом расширения, это можно сделать.

e=($(find . -maxdepth 1 -type d))
c=${2:-${e[$((RANDOM%${#e[@]}))]}}

Объяснение: e - это массив имен каталогов, c выбранный каталог, либо явно названный как $ 2,

${2:-...}  

где ... альтернативный случайный выбор, заданный

${e[$((RANDOM%${#e[@]}))]}  

где

$((RANDOM%...))  

число, сгенерированное bash, делится на количество элементов в массиве e, заданное

${#e[@]}  

с получением остатка (от оператора%), который становится индексом для массива e

${e[...]}

Таким образом, у вас есть четыре вложенных расширения.

0 голосов
/ 16 мая 2016

Eval позволит вам делать то, что вы хотите:

export HELLO="HELLO"
export HELLOWORLD="Hello, world!"

eval echo "\${${HELLO}WORLD}"

Выход: Hello, world

0 голосов
/ 26 сентября 2014

Если мотивация состоит в том, чтобы «запутывать» (я бы сказал, упорядочить) обработку массива в духе «пониманий» Python, создайте вспомогательную функцию, которая выполняет операции последовательно.

function fixupnames()
   {
   pre=$1 ; suf=$2 ; shift ; shift ; args=($@)
   args=(${args[@]/#/${pre}-})
   args=(${args[@]/%/-${suf}})
   echo ${args[@]}
   }

Вы можете использовать результат с хорошим однострочником.

$ echo $(fixupnames a b abc def ghi)
a-abc-b a-def-b a-ghi-b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...