Use nested var for substitute var

Вы должны понимать, что регулярные выражения csplit являются BRE и, следовательно, не будут понимать + \ | и т. Д.

Просто сделайте следующее:

csplit yourfile '%^[0-9]*|t|%' '/^[0-9]*|t|/' '{*}'

Затем найдите файлы с именем xxNN в вашем текущем каталоге.

1
25.11.2016, 16:39
3 ответа

Это было для передачи аргумента другой функции, лучший способ, который я нашел:

local CLIENT_URL="${CLIENT}_URL"
local CLIENT_FOLDER="${CLIENT}_FOLDER"
local CLIENT_BIN_PATH="${CLIENT}_BIN_PATH"
installClient   ${UPDATE_OS_PACKAGES}\
                ${USER_NAME}\
                ${GROUP_NAME}\
                ${!CLIENT_URL}\
                ${!CLIENT_FOLDER}\
                ${!CLIENT_BIN_PATH}

Это было по этой причине я не хотел использовать временный var или eval. (Прошу прощения за ответ через 2 недели.)

0
27.01.2020, 23:46

try

var=${FOO}BAR
## to print
eval echo \$$var
## to set
somevar=$(eval echo \$$var)
-1
27.01.2020, 23:46

В любом случае потребуется некоторая оценка кода выполнения

eval "var=\${${FOO}BAR}"
printf '%s\n' "$var"

Или без временной var :

eval "printf '%s\n' \"\${${FOO}BAR}\""

Если вас беспокоит, что $ FOO может содержать другие вещи чем имя переменной (например, foo = $ (reboot) , что может иметь плохие последствия), вам нужно провести дезинфекцию вручную, например:

valid_variable() {
  local LC_ALL=C
  case $1 in
    ("" | *[![:alnum:]]* | [0-9]*) return 1
  esac
}

valid_variable "${FOO}BAR" || exit 1
eval "printf '%s\n' \"\${${FOO}BAR}\""

С zsh , вы можете сделать:

printf '%s\n' ${(P):-${FOO}BAR}}

, но вы все равно захотите очистить значение $ FOO , если ему не доверяют, поскольку значения вроде x [0 $ (reboot)] все равно быть проблемой.

2
27.01.2020, 23:46

Теги

Похожие вопросы