답변:
이것이 변수를 인용해야하는 이유 중 하나입니다.
echo "${str:$i:1}"
그렇지 않으면 bash는 변수를 확장하고이 경우 인쇄하기 전에 globbing을 수행합니다. 매개 변수를 스크립트에 인용하는 것이 좋습니다 (일치하는 파일 이름이있는 경우).
sh lash_ch.sh 'abcde*'
bash 참조 매뉴얼 의 확장 순서도 참조하십시오 . 변수는 파일 이름 확장 전에 확장됩니다.
마지막 문자를 얻으려면 -1
음수 인덱스가 문자열의 끝에서 계산되므로 인덱스로 사용해야 합니다.
echo "${str: -1}"
콜론 ( :
) 뒤의 공백 은 필수입니다.
이 접근 방식은 공간 없이는 작동하지 않습니다.
echo "${str:$((${#str}-1)):1}"
. 이렇게하면 반환되는 후행 문자도 변경할 수 있습니다. 이 작업은 bash v4.1.0 (1)
"${1:-1}
@perreal에 따르면 변수를 인용하는 것이 중요하지만 주석에서 당면한 질문에 대한 더 간단한 접근 방식을 찾기 전에이 게시물을 5 번 읽었 기 때문에 ...
str='abcd/'
echo "${str: -1}"
산출: /
str='abcd*'
echo "${str: -1}"
산출: *
위에 참여 해주신 모든 분들께 감사드립니다. 스레드 전체에 적절하게 +1을 추가했습니다!
${std: -1}
. 공간이 없으면 작동하지 않습니다. 나는 이것을 만났고 ${std:~0}
(공간이 있든 없든) 작동 한다는 것을 발견했습니다 . 이것이 문서화 된 행동인지 확실하지 않지만 나는 그것을 찾는 것을 귀찮게하지 않았습니다.
.sh
검색된 문자를 변수에 할당하려고 할 때 스크립트 에서 작동하지 않습니다 . 예를 들어 declare LAST=$(echo "${str: -1}")
다음에서 시작하는 구문 오류를 표시하는 불쾌한 빨간색 막대가 나타납니다.
${str:0-1}
나는 이것이 매우 오래된 스레드라는 것을 알고 있지만 아무도 나에게 가장 깨끗한 대답이라고 언급하지 않았습니다.
echo -n $str | tail -c 1
(가) 주 -n
에코가 마지막에 개행 문자가 포함되어 있지 않습니다 만, 그래서이다.
awk 스크립트를 사용하는 또 다른 솔루션 :
마지막 1 자 :
echo $str | awk '{print substr($0,length,1)}'
마지막 5 자 :
echo $str | awk '{print substr($0,length-5,5)}'
cat file | awk '{print substr($0,length,1)}'
감사합니다!
한 줄:
${str:${#str}-1:1}
지금:
echo "${str:${#str}-1:1}"
echo "${str: -1}"
(사이의 공간을 마음 충분 :
하고 -
).
$((...))
.
지금까지의 모든 대답은 질문에서 "shell"이라는 단어가 Bash와 동일하다는 것을 의미합니다.
이것은 표준 Bourne 쉘에서이를 수행하는 방법입니다.
printf $str | tail -c 1
echo -n
user5394399가 제안한대로 $str
특수 형식 문자를 포함 할 때 문제를 방지 합니다.
-n
스위치는 bashism이다. 표준 Bourne 셸에서는 대시 등으로 작동하지 않습니다. 내 대답의 요점이었습니다.
printf "%s" "$str" | ...
:-)로 대답을 수정할 수 있습니다 .
시험:
"${str:$((${#str}-1)):1}"
예 :
someone@mypc:~$ str="A random string*"; echo "$str"
A random string*
someone@mypc:~$ echo "${str:$((${#str}-1)):1}"
*
someone@mypc:~$ echo "${str:$((${#str}-2)):1}"
g
"${1: -1}"
충분합니다.