Существует 1-строчное решение исходного вопроса ОП, базовое имя сценария с расширением файла:
progname=$(tmp=${0%.*} ; echo ${tmp##*/})
Вот еще один, но, используя чит для базового имени:
progname=$(basename ${0%.*})
Другие ответы отошли от исходного вопроса ОП и сосредоточились на том, возможно ли просто расширить результат выражений с помощью ${!var}
, но натолкнулись на ограничение, что var
должно явно соответствовать имени переменной. Сказав это, ничто не помешает вам получить 1-строчный ответ, если вы объедините выражения вместе с точкой с запятой.
ANIMAL=CAT
BABYCAT=KITTEN
tmp=BABY${ANIMAL} ; ANSWER=${!tmp} # ANSWER=KITTEN
Если вы хотите, чтобы это выглядело как единое утверждение, вы можете вложить его в подоболочку, т.е.
ANSWER=$( tmp=BABY${ANIMAL) ; echo ${!tmp} ) # ANSWER=KITTEN
Интересное использование - косвенные работы над аргументами функции bash. Затем вы можете вкладывать вызовы функций bash для достижения многоуровневой вложенной косвенности, поскольку нам разрешено выполнять вложенные команды:
Вот демонстрация косвенности выражения:
deref() { echo ${!1} ; }
ANIMAL=CAT
BABYCAT=KITTEN
deref BABY${ANIMAL} # Outputs: KITTEN
Вот демонстрация многоуровневой косвенности через вложенные команды:
deref() { echo ${!1} ; }
export AA=BB
export BB=CC
export CC=Hiya
deref AA # Outputs: BB
deref $(deref AA) # Outputs: CC
deref $(deref $(deref AA)) # Outputs: Hiya