変数の末尾から文字を削除します


130

Bashオートコンプリートは、ディレクトリ名の最後に/を追加します。これを位置パラメータからどのように取り除くことができますか?

#!/bin/sh

target=$1

function backup(){
  date=`date "+%y%m%d_%H%M%S"`
  PWD=`pwd`
  path=$PWD/$target
  tar czf /tmp/$date$target.tar.gz $path
}

backup

回答:


242

使用する

target=${1%/}

参照


8
そしてそれはPOSIXなので、かなり移植可能です。
go2null 2015年

3
参照ジルの 解答ルートを維持しながら、複数の末尾を除去する簡単な方法については、「/」S(/)安全: case $x in *[!/]*/) x=${x%"${x##*[!/]}"};; esac
go2null

1
これをDIRなどの変数と一緒に使用する必要がある場合は、次のようになりますtarget=${DIR%/}
Brad Parks

リンクが死んでいる(ウクライナ)
Зелди

@Зелди-ありがとう、修正。
マーティンクレイトン


13

パスを正規化するためのより良い解決策は、それが存在しない場合realpath $path-mオプションであると思います。このソリューションは、不要なスラッシュを自動的に削除し、pwdを追加します


realpathは、おそらく非常に移植されるものではない。unix.stackexchange.com/questions/101080/...
マシュー

realpathはLinuxディストリビューションでは事実上のGNU coreutilsの一部であり、この場合、ユーザーは移植性を
損なう

2
すべてのディストリビューションにリアルパスが含まれているわけではありません。たとえば、Linux Mint 17(Ubuntuベース)を実行していますが、デフォルトではありません。リポジトリにありますが、自動的にはインストールされません。それは私が投稿したリンクが議論していたものです。
マシュー14

正しいとマークされた答えがタイトルと最も一般的なものに最適ですが、指定されたユースケースに適したソリューションです。私にとっては、URLの末尾のスラッシュを削除したかったので、これは機能しませんでした。ここでのあなたの提案に関して、私が経験から見つけたのreadlink -fは、それよりも少し移植性があるということrealpathです。追加/代替オプションの場合:linux.die.net/man/1/readlink
flungo

1
これは私にとってはtarget=$(realpath -L --relative-base . $1)
うまくいき

3

注意してください、bash3はperlに似た正規表現をbashに追加しました。言及されているガイドは、これとGNU公式ガイドをカバーしていますが、すべてのリファレンスがカバーしている わけではありません。

私は何をしましたか?

代入2.19/*します2.19

解決

VER="2.19/foo-bar"
NEWVER=${VER%/*}

機能しません。スラッシュはまだ存在します(変数の最後にあり、例にはありません)。
Zelphir Kaltstahl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.