bash で単一の引数の末尾のスラッシュを削除するのに問題があります。
これが問題のコードです
shopt -s extglob
set "${1%%+(/)}"
残念ながら、これはすべての引数 (つまり、$2、$3) を取り込んで、1 つの大きな引数 $1 に変えてしまいます。このコーディング スタイル (sed を回避) を使用して、最初の引数だけで末尾の / を削除するにはどうすればよいですか。ありがとう
How can I remove the trailing /'s on just the first argument
入力値が何であるかは明確ではありませんが、次のようなものを使用できます。
s='abc/ 123/ foo/'
echo "${s/\/ / }"
abc 123/ foo/
これを試しましたか?
shopt -s extglob
set -- "${1%%+(/)}" "${@:2}"
それはうまくいくはずです、見てください:
$ shopt -s extglob
$ f() { set -- "${1%%+(/)}" "${@:2}"; printf 'Argument: "%s"\n' "$@"; }
$ f he//o// my/ dear/ friend
Argument: "he//o"
Argument: "my/"
Argument: "dear/"
Argument: "friend"
備考。
これには注意すべき副作用があります。引数なしで呼び出された場合 (つまり、$1
が設定されていない場合)、最初の位置引数が空に設定されます。見て:
$ f
Argument: ""
これを行う前に、最初の位置引数が設定されていることを明示的に確認する必要があります。
このようにパスを正規化しようとしていないことを願っています。次のようなパスがあるとします。
/path/to/a/banana/././././././././././././/
おっと。