文字列の最後の文字を削除したいです。次の小さなスクリプトを試してみました。
#! /bin/sh
t="lkj"
t=${t:-2}
echo $t
ちなみに「lkj」が印刷されます。私が何を間違っているのでしょうか?
答え1
bash
バージョン4.2以降では、次のことができます。
${var::-1}
例:
$ a=123
$ echo "${a::-1}"
12
以前のバージョンbash
(bash 3.2.5
OS Xなど)では、コロンの間と後ろにスペースを入れる必要があります。
${var: : -1}
答え2
POSIX シェルでは構文の意味が異なります。が${t:-2}
設定されていてnullでない場合は値に展開され、それ以外の場合は値に展開されます。パラメータ拡張で単一文字を切り捨てるために必要な構文は次のとおりです。t
t
2
${t%?}
ksh93
、bash
またはzsh
、${t:(-2)}
または${t: -2}
(スペースに注意してください)はい部分文字列拡張では適法ですが、末尾から2文字で始まる部分文字列を返すので、望むものではないかもしれません。最初i
文字列の文字ijk
)。
詳細については、Bash リファレンスマニュアルの Shell Parameter Expansion セクションを参照してください。
答え3
sedを使用すると動作します
sed 's/.$//'
未婚です。エコそれだけですecho ljk | sed 's/.$//'
。
この機能を使用すると、断線文字列のサイズに制限はありません。
答え4
シェルによるいくつかのオプション:
- POSIX:
t=${t%?}
- 回:
t=`expr " $t" : ' \(.*\).'`
- ジッシュ/ヤッシュ:
t=${t[1,-2]}
- バッシュ/zsh:
t=${t:0:-1}
- ksh93/bash/zsh/mksh:
t=${t:0:${#t}-1}
- ksh93/bash/zsh/mksh:
t=${t/%?}
- ksh93:
t=${t/~(E).$/}
- 例:
@ {t=$1} ~~ $t *?
すべてのアイテムから最後のアイテムを削除する必要がありますが、特徴、いくつかの実装(マルチバイト文字をサポートしていない実装)は最後の文字を削除することがわかります。バイト逆に(最後の文字がマルチバイトの場合は破損する可能性があります)
このexpr
バリエーションは$t
複数行改行で終わらないと仮定します。また、結果文字列が0
(または000
一部の-0
実装では)終了すると、ゼロ以外の終了状態を返します。文字列に無効な文字が含まれていると、予期しない結果が発生する可能性があります。