Похоже, вы пытаетесь разобрать шестизначное число в именах файлов, которые начинаются с $INPUT_FILE_PREFIX
и заканчиваются на $INPUT_FILE_SUFFIX
.
Так и будет:
for name in "$INPUT_DIR/$INPUT_FILE_PREFIX"??????"$INPUT_FILE_SUFFIX"; do
test -f "$name" || continue
number=${name#$INPUT_DIR/$INPUT_FILE_PREFIX}
number=${number%$INPUT_FILE_SUFFIX}
printf "Number = %s\n" "$number"
done
Измените каждый ?
на [0-9]
, если вы хотите быть уверенным, что совпадение только цифр(?
соответствует одному символу независимо от того, что это за символ ).
Подстановка параметров в цикле удаляет первую часть значения $name
, а затем последнюю часть оставшейся строки, оставляя число (из шести символов между префиксом и суффиксом )в середине в качестве единственное, что осталось в переменной $number
.
Команда
MYDATE=$("$i" | grep -oP '\d{6,6}')
Как вы обнаружили,
будет интерпретироваться как вызов всего, что находится в $i
, как команды. В то же время вы сказали, что если поставить echo
перед "$i"
, это заставит его работать, что и происходит :
.
MYDATE=$(echo "$i" | grep -oP '\d{6,6}')
Связано с вашим кодом:Почему *не *parse `ls `?
Он будет использовать больше ОЗУ и кэша из-за дополнительных библиотек. Это приведет к замедлению (большего количества операций подкачки, если оперативной памяти мало; больше промахов кеша ). Однако вы, вероятно, не заметите.