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+( 또는 뒤에)를 입력하여 버전을 확인할 수 있습니다.Vksh
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}
ksh85의 이전 버전(이미 ksh85에 있음)에 도입되었으며 ksh
POSIX에서도 에 대해 지정되었으므로 sh
언제든지 찾을 수 있습니다.sh
ksh
또는 카슈가르 이전 시대의 고대 길을 따라 가거나 ²에 의지할 수도 있습니다 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 bash
2.0(1996년 말), mksh
R30(2007) 및 4.3.11(2010년 말)부터 사용 가능하지만 zsh
1991년 2.0부터 zsh
사용 가능했습니다 $param[first,last]
.
² \{n,m\}
정규식 연산자는 오늘날 표준 연산자이지만 ksh 이전에는 사용할 수 없었으며 대체 등을 사용해야 했습니다 .\{10\}
...........