web-dev-qa-db-ja.com

シェルで文字列の最後の文字を取得する方法は?

文字列の最後の文字を取得するために、次の行を書きました。

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

それ現在のフォルダー内のファイルをリストします

104
metaphy

これが、変数を引用する必要がある理由の1つです。

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

それ以外の場合、bashは変数を展開し、この場合、印刷する前にグロビングを行います。また、スクリプトにパラメーターを引用することをお勧めします(一致するファイル名がある場合)。

sh lash_ch.sh 'abcde*'

bashリファレンスマニュアル の展開の順序も参照してください。変数はファイル名展開の前に展開されます。

最後の文字を取得するには、負のインデックスは文字列の末尾からカウントされるため、インデックスとして-1を使用するだけです。

echo "${str: -1}"
61
perreal

@perrealごとに、変数を引用することが重要ですが、コメントで手元の質問に対するより簡単なアプローチを見つける前にこの投稿を5回読んだので...

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

出力:/

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

出力:*

上記に参加したすべての人に感謝します。スレッド全体に+1を適切に追加しました!

173
quickshiftin

私はこれが非常に古いスレッドであることを知っていますが、最もクリーンな答えであると誰も言及していません:

echo -n $str | tail -c 1

-nは、エコーの最後に改行が含まれないようにするためのものです。

25
user5394399

試してください:

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

単線:

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

今:

echo "${str:${#str}-1:1}"
4
Eduardo Cuomo

これまでのすべての答えは、質問の「シェル」という言葉がBashに相当することを意味しています。

これは、標準のBourne Shellでこれを行う方法です。

printf $str | tail -c 1
3
phep

awkスクリプトを使用した別のソリューション:

最後の1文字:

echo $str | awk '{print substr($0,length,1)}'

最後の5文字:

echo $str | awk '{print substr($0,length-5,5)}'
2
mr.baby123