programing

셸에서 문자열의 마지막 문자를 가져오는 방법은 무엇입니까?

newstyles 2023. 5. 4. 19:43

셸에서 문자열의 마지막 문자를 가져오는 방법은 무엇입니까?

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

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

에 효과가 있습니다.abcd/:

$ bash last_ch.sh abcd/
/

다음에 대해서는 작동하지 않습니다.

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

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

@perreal에 따라 변수를 인용하는 것도 중요하지만, 댓글에서 질문에 대한 더 간단한 접근법을 찾기 전에 이 게시물을 5번 정도 읽었기 때문에...

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

대체 용도${str:0-1}댓글에 지적된 바와 같이.

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

참고: 추가 공간${str: -1}필요합니다, 그렇지 않으면.${str:-1}결과적으로1다음과 같은 경우 기본값으로 사용됩니다.strnull이거나 비어 있습니다.

${parameter:-word}
       Use Default Values.  If parameter is unset or null, the
       expansion of word is substituted.  Otherwise, the value of
       parameter is substituted.

위에 참여해주신 모든 분들께 감사드리며, 스레드 전체에 +1을 적절히 추가하였습니다!

이것이 변수를 인용해야 하는 이유 중 하나는 다음과 같습니다.

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

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

sh lash_ch.sh 'abcde*'

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

사용해야 하는 마지막 문자를 얻으려면-1문자열의 끝에서 음수 인덱스가 카운트되기 때문에 인덱스로:

echo "${str: -1}"

콜론 뒤의 공간(:)는 필수 항목입니다.

이 방법은 공간이 없으면 작동하지 않습니다.

저는 이것이 매우 오래된 스레드라는 것을 알지만, 아무도 제게 어떤 것이 가장 깨끗한 대답인지 언급하지 않았습니다.

echo -n $str | tail -c 1

참고:-n에코가 마지막에 새 줄을 포함하지 않도록 하는 것뿐입니다.

지금까지의 모든 대답은 질문에서 "껍질"이라는 단어가 Bash와 동일하다는 것을 암시합니다.

표준 Bourne 쉘에서 이를 수행할 수 있는 방법은 다음과 같습니다.

printf "%s" "$str" | tail -c 1

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}"

시도:

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

휴대성에 대해서는 다음과 같습니다."${s#"${s%?}"}":

#!/bin/sh
m=bzzzM n=bzzzN
for s in \
    'vv'  'w'   ''    'uu  ' ' uu ' '  uu' / \
    'ab?' 'a?b' '?ab' 'ab??' 'a??b' '??ab' / \
    'cd#' 'c#d' '#cd' 'cd##' 'c##d' '##cd' / \
    'ef%' 'e%f' '%ef' 'ef%%' 'e%%f' '%%ef' / \
    'gh*' 'g*h' '*gh' 'gh**' 'g**h' '**gh' / \
    'ij"' 'i"j' '"ij' "ij'"  "i'j"  "'ij"  / \
    'kl{' 'k{l' '{kl' 'kl{}' 'k{}l' '{}kl' / \
    'mn$' 'm$n' '$mn' 'mn$$' 'm$$n' '$$mn' /
do  case $s in
    (/) printf '\n' ;;
    (*) printf '.%s. ' "${s#"${s%?}"}" ;;
    esac
done

출력:

.v. .w. .. . . . . .u. 
.?. .b. .b. .?. .b. .b. 
.#. .d. .d. .#. .d. .d. 
.%. .f. .f. .%. .f. .f. 
.*. .h. .h. .*. .h. .h. 
.". .j. .j. .'. .j. .j. 
.{. .l. .l. .}. .l. .l. 
.$. .n. .n. .$. .n. .n. 
expr $str : '.*\(.\)'

또는

echo ${str: -1}

순수 POSIX 방법에 관심이 있는 사용자:

https://github.com/spiralofhope/shell-random/blob/master/live/sh/scripts/string-fetch-last-character.sh

#!/usr/bin/env  sh

string_fetch_last_character() {
  length_of_string=${#string}
  last_character="$string"
  i=1
  until [ $i -eq "$length_of_string" ]; do
    last_character="${last_character#?}"
    i=$(( i + 1 ))
  done

  printf  '%s'  "$last_character"
}


string_fetch_last_character  "$string"
echo $str | cut -c $((${#str}))

좋은 접근법입니다.

언급URL : https://stackoverflow.com/questions/17542892/how-to-get-the-last-character-of-a-string-in-a-shell