2016-06-29 7 views
0

コマンドを変数として別の関数に渡すことはできますか?はいの場合、構文は何ですか?Unixの関数に変数としてコマンドを渡す

私のコードは次のようになります。

function1(){ 

for a in $1 
do 
    echo $a 
done 
} 

function2(){ 

function1 "ls -lrt folder/Name | grep 'foo' | grep 'bar'" 

} 

しかし、これは機能しません。

function1 `ls -lrt folder/Name | grep 'foo' | grep 'bar'` 

しかし、これは、コマンドの最初の値のみを渡し(と私はこれがなぜ起こるかを理解する):私もとしてそれを渡してみました。

誰かが変数として機能するコマンドを渡す構文を知っていますか?

+1

あなたが 'function1'で' for $ 1'と言っているのは、最初のパラメータを調べているということです。すべてのパラメータをループしたい場合は、 '$ @'を使う必要があります。 – fedorqui

+0

上記のコメントは正しいですが、forループを省略して 'echo @ a'を実行することもできます。もしあなたがその一つの文字列/関数を渡すつもりならば、 – Vaelor

+0

私はそれを試しました。どうもありがとう! :) – user2882388

答えて

0

コメントに示されているように、$1を使用していますが、これには最初のパラメータが含まれています。代わりに[email protected]を使用する必要があります。 Bash Manual → 3.4.2 Special Parametersから

($ @を)@

$が1から始まって、位置パラメータに展開されます。 拡張が二重引用符で囲まれている場合、各パラメータは 別名に展開されます。つまり、 "$ @"は "$ 1" "$ 2" ...に相当します。 二重引用拡張が単語内で発生する場合、 最初のパラメータの拡張子は元の 語の先頭部分と結合され、最後のパラメータの展開は元の単語の最後の 部分と結合されます。位置パラメータがない場合、 "$ @"と$ @は何も展開しません(つまり、それらは削除されます)。

次に、あなたはfunction1は、複数のパラメータを取る場合はどう

を頼みますか?そしてコマンドは で、3番目のパラメータが渡され、$ @を使用するといくつかの の不要な値が取り込まれます。 $ 3以降の値段はどのように取るのですか?このため

は、あなたがshiftを使用したい:

$ cat myscript.sh 
#!/bin/bash 
shift 2 

echo "[email protected]" 
$ ./myscript.sh a b c d 
c d 

シフト

shift [n] 

シフトnだけ左に位置パラメータ。 n + 1 ... $#の位置 のパラメータは、$ 1 ... $# - nに名前が変更されます。 $#〜$# - n + 1の数字で表されるパラメータ は設定されていません。 nは で、負の数は$#以下でなければなりません。 nが0以上が$#より大きい場合、位置パラメーターは変更されません。 nが でない場合、1とみなされます。nが が$#より大きいかゼロより小さくない場合、戻り値のステータスはゼロです。それ以外の場合は0以外です。

関連する問題