1

正規表現をパラメーターとしてシェルスクリプトに渡す方法は?

パラメータを受け取り、UNIXコマンドに渡すシェルスクリプトを作成する必要があります。そこで正規表現を使いたいです。これは可能ですか?

または再定式化-このコマンドのみを使用して、「cp」コマンドと同等のスクリプトを作成する方法は?

ファイル「mycp」を作成しようとしています

#!/bin/bash -fx
cp $2 $1 

とそれを呼び出す

mycp myDir "*sh" 

「cp*shmyDir」と同じようにします。しかし、結果として得られるbashの解釈は次のとおりです。

+ cp '*sh' myDir
cp: *sh: No such file or directory
4

3 に答える 3

2

改訂された質問

ファイル「mycp」を作成しようとしています

#!/bin/bash -fx
cp $2 $1 

そしてそれを

mycp myDir "*sh" 

その場合、まだ必要ですevalが、次のように記述します。

#!/bin/bash -x
eval cp "$2" "$1"

オプションを指定したため、問題が発生してい-fます。 man bash言います(一部):

単語分割の後、-fオプションが設定されていない限り、bash は各単語をスキャンして文字*?、およびを探します[

fスクリプトの「shebang」(最初の) 行から を削除します。


元の質問

引数でシェル展開を行いたい場合mycp "*sh*" aa、おそらくevalスクリプトで次のように使用することになります。

eval cp "$@"

ただし、 の使用evalは危険です。予期しない副作用につながる可能性があります。の使用"$@"は重要です。引数とスペースの数が保持されます。残念ながら、evalthen を使用すると元に戻せますが、すべてを取得することはできません (または簡単ではありません)。


かなり長い間 (たとえば 1987 *から 1999 年まで)、私はこのスクリプトを の表紙として使用していましたcp

:   "@(#)$Id: cp.sh,v 1.3 1997/06/02 21:45:00 johnl Exp $"
#
#   Alternative copy command

case $# in
0)  /bin/cp     ;;
1)  /bin/cp $1 .    ;;
2)  /bin/cp "$@"    ;;
*)  if [ -d `la "$@"` ]
    then    /bin/cp "$@"
    else    /bin/cp "$@" .
    fi;;
esac

('last argument')と呼ばれる非常に単純な C プログラムを使用してla最後の引数を取得し、指定された最後の引数がディレクトリかどうかをチェックします。99% 以上の確率で、(偶然にも) 'cp /some/where/ sh ' と入力した場合cp /some/where/*sh* .、2 番目が意図したものであり、スクリプトによって修正されました。かなり長い間使用していません。それは最後の千年紀にあったかもしれませんが、私がそれを使うのをやめたのは、おそらくこの千年紀の早い時期でした.

バージョン文字列は「1997」となっていますが、コードは1987年版と同一です。バージョン 1.1 と 1.2 は SCCS の下にあり、異なる SCCS ID 文字列を使用していました。RCS への変換により、それらは同一になりました。バージョン 1.3@(#)では、SCCSwhatコマンドで使用される識別子文字列が RCS バージョンの処理に復活しました。つまり、スクリプトは古いものです — 本当に 1987 年です。

于 2012-08-11T01:57:21.130 に答える
1

最初にディレクトリを指定するだけの場合は、-tGNUcpのオプションを確認してください。

alias mycp='cp -t'
mycp mydir *.sh

さもないと:

mycp() {
  local dir=$1
  shift
  cp "$@" "$dir"
}
mycp mydir *.sh

いずれにせよ、シェルにワイルドカードを展開させ、eval

(注意、*.sh正規表現ではなく、シェルの「パターン」であり、「グロブパターン」と呼ばれることもあります)

于 2012-08-11T03:24:58.040 に答える
1

これを試して:eval cp $1 $2

Bash リファレンス マニュアル: eval

于 2012-08-11T01:46:50.800 に答える