1

ここでスクリプティングを bash する初心者。いくつかの mysql データベースを照会するためにいくつかの便利な関数を使用して bash_profile を装備していますが、渡されたパラメーターをエイリアスとして bash に認識させるのに問題があります。詳細については、以下を参照してください。

function findfield() {
    $2 -e
    "SELECT TABLE_NAME,TABLE_SCHEMA,COLUMN_NAME AS 'Matched Field'
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME LIKE '$1';"
}

使用例:

findfield %field% mpc

mpc は、クエリするデータベースを指すエイリアスです。この使用法はエラーを返します。

-bash: mpc: command not found

上記の関数は、$2 の代わりに mpc をハードコードするだけで機能します。では、代わりにエイリアスをパラメーターとして使用すると機能しないのはなぜでしょうか?

4

2 に答える 2

2

エイリアスは、非対話型シェルではデフォルトでは機能しません。でそれを変更できますがshopt -s expand_aliases、それが役立つかどうかはわかりません。

別の評価レイヤーが必要です。bash がすべての置換を終了し、コマンドを実行しようとするまでに、「mpc」を文字列と見なします。でこの変更を修正できますがeval、他のパラメーターを保護する必要があり、誰かが何かいたずらを渡した場合はどうなりますか? これが、eval の使用が一般的に嫌われている理由です。ただし、避けられない場合もあります。

$ run() { $1; }
$ alias alal=uname
$ run whoami
lynx
$ run alal
bash: alal: command not found
$ run() { shopt -s expand_aliases; $1; shopt -u expand_aliases; }
$ run alal
bash: alal: command not found
$ run() { shopt -s expand_aliases; eval $1; shopt -u expand_aliases; }
$ run alal
Linux

とにかく、SQLの引用符を修正する必要があります。そうしないと、フィールドが展開されなくなります。ここでの構文の強調表示により、これが明確になります。簡単な方法は、$1 を " のペアで囲むことです。これにより、文字列が渡されるまで効果的に 3 つに分割されます。

于 2013-03-16T23:26:39.060 に答える
0

bash_profileファイルに次の行を追加する必要がある場合があります。

function myalias_func()
{
        some code here with different variables $1, $2...
}
alias myalias=myalias_func

つまり、行を含めてみてください

alias findfield=findfield

そしてそれはうまくいくはずです。

于 2013-03-16T23:59:09.250 に答える