回答:
これが、変数を引用する必要がある理由の1つです。
echo "${str:$i:1}"
それ以外の場合、bashは変数を展開し、この場合は出力前にグロビングを実行します。スクリプトにパラメーターを引用することもお勧めです(一致するファイル名がある場合)。
sh lash_ch.sh 'abcde*'
bashリファレンスマニュアルの展開の順序も参照してください。変数はファイル名展開の前に展開されます。
-1
負のインデックスは文字列の最後から数えるので、最後の文字を取得するにはインデックスとして使用するだけです。
echo "${str: -1}"
コロン(:
)の後のスペースは必須です。
このアプローチはスペースなしでは機能しません。
echo "${str:$((${#str}-1)):1}"
。これにより、返される末尾の文字も変えることができます。このbash v4.1.0(1)での作業
"${1:-1}
@perrealごとに、変数を引用することが重要ですが、コメントで手元の質問に対するより簡単なアプローチを見つける前に、この投稿を5回程度読んだので...
str='abcd/'
echo "${str: -1}"
出力: /
str='abcd*'
echo "${str: -1}"
出力: *
これに上記に参加したすべての人に感謝します。スレッド全体に+1を適切に追加しました!
${std: -1}
。スペースがないと機能しません。私はこれに遭遇し、それ${std:~0}
も機能することを発見しました(スペースの有無にかかわらず)。これが文書化された動作であるかどうかはわかりませんが、私はそれを調べる必要はありません。
.sh
取得した文字を変数に割り当てようとすると、このソリューションはスクリプトでは機能しません。例えばdeclare LAST=$(echo "${str: -1}")
:これはから始まる構文エラーを示す厄介な赤いバーになります
${str:0-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)}'
cat file | awk '{print substr($0,length,1)}'
ありがとう!
単線:
${str:${#str}-1:1}
今:
echo "${str:${#str}-1:1}"
echo "${str: -1}"
で十分です(:
との間のスペースに注意してください-
)。
$((...))
。
これまでのすべての回答は、質問の「シェル」という単語がBashに相当することを意味しています。
これは、標準のBourneシェルでこれを行う方法です。
printf $str | tail -c 1
echo -n
user5394399によって提案されているように、$str
特殊なフォーマット文字が含まれている場合の問題を回避します。
-n
スイッチがbashismです。それはダッシュなどの標準のBourneシェルでは機能しません...それが私の答えのポイントでした。
printf "%s" "$str" | ...
:-) で修正できます。
試してください:
"${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
"${1: -1}"
十分です。