셸에서 문자열의 마지막 문자를 가져오는 방법은 무엇입니까?
문자열의 마지막 문자를 얻기 위해 다음 행을 작성했습니다.
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
다음과 같은 경우 기본값으로 사용됩니다.str
null이거나 비어 있습니다.
${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 방법에 관심이 있는 사용자:
#!/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
'programing' 카테고리의 다른 글
Mongo에서 문자열로 BinData UUID 가져오기 (0) | 2023.05.04 |
---|---|
배치 파일에서 어떤 주석 스타일을 사용해야 합니까? (0) | 2023.05.04 |
집계 프레임워크의 $198 및 $제한 (0) | 2023.05.04 |
Azure 함수에서 간단한 방법으로 GET 쿼리 매개 변수를 가져오는 방법은 무엇입니까? (0) | 2023.05.04 |
Angular에서 사용자 지정 테마 팔레트를 사용하려면 어떻게 해야 합니까? (0) | 2023.05.04 |