Расширение параметров оболочки не работает в AIX

Только при использованииgrep:

grep -Po 'VERSION="[0-9]+ \(\K[^)]+' /etc/os-release

Попробуйте (вывод на момент написания этого поста):

$ docker run --rm debian:stable-slim grep -Po 'VERSION="[0-9]+ \(\K[^)]+' /etc/os-release
stretch
1
26.03.2021, 22:10
1 ответ

${param:offset:length}был введен ksh93¹, он не был доступен в ksh88. Поэтому вам нужно убедиться, что скрипт интерпретируется ksh93, а не ksh88.

Также помните, что расширения параметров должны заключаться в кавычки в большинстве Bourne -подобно оболочкам, по крайней мере, в контекстах списка.

Вы можете ввести Esc , Ctrl + V в интерактивном kshс включенным строковым редактором (после set -o emacsили viили gmacs), чтобы проверить его версию.

Здесь вместо ${filename:10:14}можно использовать

filename=25_032021_abcdefghijklmn.txt
id="${filename%.*}" # remove extension from the end
id="${id#*_*_}"     # remove up to second _ from the start
mv "/u/foo/test/25_032021_test_$id.txt" \
   "/u/foo/test/25_032021_test_$id.txt.tmpExtension"

Чтобы удалить 10 символов из начала вместо *_*_, используйте ${param#??????????}. Так,эквивалент id=${filename:10:14}при условии, что filenameимеет не менее 24 символов, будет:

id=${filename#??????????}       # remove 10 characters from the start
id=${id%"${id#??????????????}"} # remove from the end: $id stripped of
                                # its first 14 characters

Эти ${param#pattern}и ${param%pattern}были введены в более ранних версияхksh(уже в ksh85 )и даже указаны POSIX для sh, поэтому вы должны найти их в любом shили ksh. ] В эти дни.

Или можно было пойти древним путем от до-ksh дней и прибегнуть к expr².

id=`expr "x$filename" : 'x.\{10\}\(.\{14\}\)'`

или:

id=`expr "x$filename" : 'x.\{10\}\(.\{0,14\}\)'`

(для более строгого эквивалента ksh93 ${filename:10:14}, когда $filenameсодержит менее 24 символов ).

Осторожно, exprвернет статус выхода с ошибкой, если то, что он выводит, является представлением числа 0, пустой строки или регулярного выражения, поэтому вам может потребоваться добавить || true, если у вас есть включил опцию errexit, чтобы оболочка не закрывалась, например, для файлов с именем 123456789_00000000000000.txt.

Этот exprподход также не будет работать должным образом, если id заканчивается символами новой строки (, которые будут удалены при подстановке команды ).


¹ также доступно в bashс версии 2.0 (с конца 1996 года ), mkshс версии R30 (2007 года )и zshс версии 4.3.11 (с конца 2010 года ), хотя у zshбыло $param[first,last]с версии 2.0 в 1991 году.

² хотя оператор регулярных выражений \{n,m\}сегодня является стандартным, он не был бы доступен в те дни до -ksh, и вам пришлось бы, например, заменить .\{10\}на ...........

3
28.04.2021, 22:56

Теги

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