AIX에서는 쉘 매개변수 확장이 작동하지 않습니다.

AIX에서는 쉘 매개변수 확장이 작동하지 않습니다.

AIX에서 작동하지 않는 특정 문자열을 바꾸려고 하는데 RHEL에서 실행하면 예상한 출력을 얻을 수 있습니다.

이것은 명령입니다:

filename=25_032021_abcdefghijklmn.txt; mv /u/foo/test/25_032021_test_${filename:10:14}.txt /u/foo/test/25_032021_test_${filename:10:14}.txt.tmpExtension

AIX에서 이 명령을 실행할 때 발생하는 오류입니다.

ksh: /u/foo/test/25_032021_test_${filename:10:14}.txt: 0403-011 The specified substitution is not valid for this command.

내가 뭘 잘못하고 있는지 아시나요?

답변1

${param:offset:length}에 의해 도입되었으며 ksh93에서는 사용할 수 없습니다 ksh88. 따라서 스크립트가 ksh88이 아닌 ksh93에 의해 해석되는지 확인해야 합니다.

또한 대부분의 Bourne 유사 쉘에서는 적어도 목록 컨텍스트에서는 매개변수 확장을 인용해야 한다는 점을 기억하세요.

대화형 행 편집기에서 Esc, Ctrl+( 또는 뒤에)를 입력하여 버전을 확인할 수 있습니다.Vkshset -o emacsvigmacs

여기에서 ${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}최소 filename24자를 가정하면 다음과 같습니다.

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}ksh85의 이전 버전(이미 ksh85에 있음)에 도입되었으며 kshPOSIX에서도 에 대해 지정되었으므로 sh언제든지 찾을 수 있습니다.shksh

또는 카슈가르 이전 시대의 고대 길을 따라 가거나 ²에 의지할 수도 있습니다 expr.

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

또는:

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

${filename:10:14}( $filename문자 수가 24개 미만인 경우 ksh93과 더 엄격하게 동일합니다.)

expr숫자 0 또는 빈 문자열 표현을 출력하거나 정규 표현식이 일치하지 않으면 실패한 종료 상태를 반환하므로 || true해당 옵션이 활성화된 경우 errexit그렇지 않도록 a를 추가해야 할 수도 있습니다. 123456789_00000000000000.txt예를 들어 다음과 같습니다 . 원인 셸은 호출 파일에서 종료됩니다.

expr만약에ID개행 문자로 끝납니다(명령 대체에 의해 제거됨).


1 bash2.0(1996년 말), mkshR30(2007) 및 4.3.11(2010년 말)부터 사용 가능하지만 zsh1991년 2.0부터 zsh사용 가능했습니다 $param[first,last].

² \{n,m\}정규식 연산자는 오늘날 표준 연산자이지만 ksh 이전에는 사용할 수 없었으며 대체 등을 사용해야 했습니다 .\{10\}...........

관련 정보