0

私はシェルスクリプトを書いています:

read newcatalog
newcatalog=`'print -- $newcatalog | sed 's/^-/\.\/-/'`
cd "$newcatalog"

newcatalogこれは新しいカタログの名前です。カタログ名は*をサポートする必要がありますか?および任意のオプション。

カタログ名の「-n」「-y」などの「-」は正常に動作しますが、*動作しないため動作しません。

print -- $newcatalog 

意味

print -- * | sed 's/^-/\.\/-/'

そしてそれはsedすべてのファイルに送信しますが、私は次のようにのみ送信したいと思います*

print -- "*" | sed 's/^-/\.\/-/'
4

2 に答える 2

1

この行は間違っています:

newcatalog=`'print -- $newcatalog | sed 's/^-/\.\/-/'`

バックティック内の最初の一重引用符は侵入者であり、シェルがそれを診断しているはずです。

newcatalog=`print -- $newcatalog | sed 's/^-/\.\/-/'`

(これにより、実際に何を実行しているのかという疑問が残ります。)通常、$(...)の代わりにを使用する必要があり`...`ます。

newcatalog=$(print -- $newcatalog | sed 's/^-/\.\/-/')

のシェルメタ文字展開を回避しようとしている場合は、を二重引用符で*囲みます。$newcatalog

newcatalog=$(print -- "$newcatalog" | sed 's/^-/\.\/-/')

それはあなたを完全に保護することにはなりません。誰かが次のように入力した場合:$(rm -f *)への応答として、read catalog二重引用符を使用しても深刻な問題が発生します。

于 2013-03-10T17:35:53.167 に答える
0

あなたはあまりにも一生懸命働いています。sed置換を行うために呼び出す必要はありません。ただ行う:

test "${newcatalog#-}" = "$newcatalog" || newcatalog="./$newcatalog"
于 2013-03-10T19:10:55.783 に答える