В исходном вопросе OP есть однострочное решение, базовое имя скрипта с расширением файла:
progname=$(tmp=${0%.*} ; echo ${tmp##*/})
Вот еще один, но, используя чит для basename:
progname=$(basename ${0%.*})
. Другие ответы ушли от исходного вопроса OP и сосредоточились на том, можно ли просто расширить результат выражений с помощью ${!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
Если у вас есть файл с именем batchfile1
в пути path
, и вы ожидаете, что он будет выполнен ... тогда этого не произойдет, поскольку ресурс batch
не такой, как работает.
Я могу предположить, что первый ресурс batch
не был выполнен, что привело к сбою запуска chef-client и, таким образом, второй ресурс batch
не был выполнен.
Пакетный ресурс создает и выполняет временный файл (аналогично тому, как ведет себя ресурс скрипта), а не запускает встроенную команду. например:
blockquote>batch 'echo some env vars' do code <<-EOH echo %TEMP% echo %SYSTEMDRIVE% echo %PATH% echo %WINDIR% EOH end