文字列の最後の文字を取得するために、次の行を書きました。
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
それ現在のフォルダー内のファイルをリストします。
これが、変数を引用する必要がある理由の1つです。
echo "${str:$i:1}"
それ以外の場合、bashは変数を展開し、この場合、印刷する前にグロビングを行います。また、スクリプトにパラメーターを引用することをお勧めします(一致するファイル名がある場合)。
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
は、エコーの最後に改行が含まれないようにするためのものです。
試してください:
"${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
単線:
${str:${#str}-1:1}
今:
echo "${str:${#str}-1:1}"
これまでのすべての答えは、質問の「シェル」という言葉がBashに相当することを意味しています。
これは、標準のBourne Shellでこれを行う方法です。
printf $str | tail -c 1
awkスクリプトを使用した別のソリューション:
最後の1文字:
echo $str | awk '{print substr($0,length,1)}'
最後の5文字:
echo $str | awk '{print substr($0,length-5,5)}'