Вы должны понимать, что регулярные выражения csplit
являются BRE
и, следовательно, не будут понимать +
\ |
и т. Д.
Просто сделайте следующее:
csplit yourfile '%^[0-9]*|t|%' '/^[0-9]*|t|/' '{*}'
Затем найдите файлы с именем xxNN
в вашем текущем каталоге.
Это было для передачи аргумента другой функции, лучший способ, который я нашел:
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 недели.)
try
var=${FOO}BAR
## to print
eval echo \$$var
## to set
somevar=$(eval echo \$$var)
В любом случае потребуется некоторая оценка кода выполнения
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)]
все равно быть проблемой.