./
の最初から削除したいです./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にすでに存在し、sh
90年代初頭POSIXで指定されたkshに由来していたのでsh
。bash
sh
²少なくともリストコンテキスト内のアイテム。var=$param
(スカラー代わりに変数リスト/大量に変数)や他の非リストコンテキストもありますが、問題にはなりません。