Bash 4.2 では、負の部分文字列の長さのサポートが追加されました。
http://tldp.org/LDP/abs/html/abs-guide.html#SUBSTREXTR01
例 37-12. 文字列抽出構文における負のパラメータ
「長さ」パラメータが負の場合、それは終了からのオフセットパラメータとして機能します。
たとえば、Ubuntu でテストすると、次のように「World」が出力されます。
STR="Hello World!"
echo ${STR:6:-1}
しかし、OS X (GNU bash、バージョン 4.3.42(1)-release (x86_64-apple-darwin14.5.0)) では、その使用法によって次のエラーが発生します。
-1: substring expression < 0
これは OS X 特有のものですか、それとも後の bash アップデートで再び無効になりましたか? OS X でこの機能を有効にする方法はありますか?
答え1
flabdablet のソリューションは固定長の文字列に対してのみ機能しますが、動的にサイズが変更される文字列の代替としてこれを使用できます。
echo ${STR:6:$((${#STR} - 6 - 1))}
詳細に:
${#STR}
文字列の長さを返します。$((a - b - c))
数学的な引き算をする${STR:start:len}
部分文字列を返します。
したがって、部分文字列式の 2 番目の引数を組み合わせると、文字列の長さから開始オフセットを引いた値と、新しい bash 構文で負の値として指定する値を引いた値になります。
答え2
STR に少なくとも 7 文字が含まれていることが保証されている場合、${STR:6:${#STR}-7} は ${STR:6:-1} の代替として機能します。これより短い場合、OS X bash が負の長さについてエラーを発したり、負の長さを右からのオフセットとしてサポートする bash バージョンでひどいエラーが発生したりします。
答え3
長さを入力して計算することで、最後に動的にカットすることが可能です。
${STR:0:${#STR}-2}
-2 は負の量です。
答え4
Googleから検索ここ:
${STR:6:$#-1}
うまくいくはずだと彼らは言う
私の場合、同様のエラーが発生しましたが${VERSION::-2}
、次のように 0 を追加した後、動作するようになりました${VERSION:0:-2}
。