Bashで文字列の先頭からドットとスラッシュを削除する方法は?

Bashで文字列の先頭からドットとスラッシュを削除する方法は?

./の最初から削除したいです./Accounts

これは私のスクリプトです。

export Item=./Accounts
echo $Item
export ReplacedItem=${$Item/.\//}
echo $ReplacedItem

しかし、私は次のようになります。

main.sh: 行 3: 置き換えられたアイテム=${$Item/.//}: 無効な置換

私は何が間違っていましたか?

答え1

標準演算子 1 が使用され、ここでは ksh93 スタイル演算子はsh ${param#pattern}必要ありません。${param/pattern/replacement}${$param/pattern/replacement}

さらに、他のコマンドがそれを継承したくない限り、これらの変数をエクスポートする必要はありません。また、echo任意のデータを印刷するために使用することはできず、パラメータ拡張が存在する必要があることに注意してくださいbash

Item=./Accounts
printf '%s\n' "$Item"
ReplacedItem="${Item#./}"
printf '%s\n' "$Item"

ksh93スタイルを使用する場合は、${param/pattern/replacement}次のようにする必要があります。

ReplacedItem="${Item/.\//}"

/代替項目が空の文字列の場合は、パターンと代替項目の前の項目を省略できます。

ReplacedItem="${Item/.\/}"

ただし、最初ではなくても./inの最初の項目を削除することに注意してください。$Item最初にのみ削除するには、#パターンの先頭に追加するだけです。

ReplacedItem="${Item/#.\/}"

(しかし、繰り返しますが、標準と比較して利点はありません${Item#./})。


もともとksh85にすでに存在し、sh90年代初頭POSIXで指定されたkshに由来していたのでshbashsh

²少なくともリストコンテキスト内のアイテム。var=$paramスカラー代わりに変数リスト/大量に変数)や他の非リストコンテキストもありますが、問題にはなりません。

関連情報