[string] 쉘에서 문자열의 마지막 문자를 얻는 방법은 무엇입니까?

문자열의 마지막 문자를 얻기 위해 다음 줄을 작성했습니다.

str=$1
i=$((${#str}-1))
echo ${str:$i:1}

다음을 위해 작동합니다 abcd/.

$ bash last_ch.sh abcd/
/

다음 에서는 작동하지 않습니다abcd* .

$ bash last_ch.sh abcd*
array.sh assign.sh date.sh dict.sh full_path.sh last_ch.sh

그것은 현재 폴더에있는 파일을 나열합니다 .



답변

이것이 변수를 인용해야하는 이유 중 하나입니다.

echo "${str:$i:1}"

그렇지 않으면 bash는 변수를 확장하고이 경우 인쇄하기 전에 globbing을 수행합니다. 매개 변수를 스크립트에 인용하는 것이 좋습니다 (일치하는 파일 이름이있는 경우).

sh lash_ch.sh 'abcde*'

bash 참조 매뉴얼 의 확장 순서도 참조하십시오 . 변수는 파일 이름 확장 전에 확장됩니다.

마지막 문자를 얻으려면 -1음수 인덱스가 문자열의 끝에서 계산되므로 인덱스로 사용해야 합니다.

echo "${str: -1}"

콜론 ( :) 뒤의 공백 은 필수입니다.

이 접근 방식은 공간 없이는 작동하지 않습니다.


답변

@perreal에 따르면 변수를 인용하는 것이 중요하지만 주석에서 당면한 질문에 대한 더 간단한 접근 방식을 찾기 전에이 게시물을 5 번 읽었 기 때문에 …

str='abcd/'
echo "${str: -1}"

산출: /

str='abcd*'
echo "${str: -1}"

산출: *

위에 참여 해주신 모든 분들께 감사드립니다. 스레드 전체에 적절하게 +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)}'


답변

한 줄:

${str:${#str}-1:1}

지금:

echo "${str:${#str}-1:1}"


답변

지금까지의 모든 대답은 질문에서 “shell”이라는 단어가 Bash와 동일하다는 것을 의미합니다.

이것은 표준 Bourne 쉘에서이를 수행하는 방법입니다.

printf $str | tail -c 1


답변

시험:

"${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