web-dev-qa-db-ja.com

xargsで変数を2回繰り返す方法

この例でも、2番目のエコーをエコーアウトテストにするにはどうすればよいですか。

 echo test  | xargs -I {} echo {} && echo {}
24
defiler

コマンドで{}を2回記述するだけです。以下は機能します:

$ echo test | xargs -I {} echo {} {}
test test

あなたの問題は、コマンドが入れ子である方法です。これを見てみましょう:

echo test | xargs -I {} echo {} && echo {}

bashecho test | xargs -I {} echo {}を実行します。正常に実行されると、echo {}が実行されます。入れ子を変更するには、次のようにします。

echo test | xargs -I {} sh -c "echo {} && echo {}"

ただし、このアプローチではコードインジェクションが発生しやすいため、問題が発生する可能性があります。 「test」がシェルコードに置き換えられると、実行されます。したがって、入力をネストされたシェルに引数で渡す必要があります。

echo test | xargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
32
JojOatXGME

別のオプションは、-iフラグを使用することです。これは、-I{}と同じです(これは、置換が{}で行われることを意味します):

$ echo test | xargs -i echo {} {}
5
Omer Dagan

私にとっては小文字のみが機能します。ディレクトリに何百もの画像があり、それらのソースをリストに入れたいと思っていました。大文字のi _-I_オプションが機能しませんでした。小文字のみ。おそらくバージョンの違いが原因です。これらの画像はすべてDaniel_(somenumber).jpgのような名前でした。

この構文はうまくいきました:

_ls -l | tr -s ' ' ':'| cut -d: -f9 | xargs -i echo "img src='"{}"'alt='{}'"
_

戻り値:

_src='Daniel_248.jpg' alt='Daniel_248.jpg'
...
_

Linuxバージョン4.14.96-hw +#80 SMP x86_64 GNU/Linux

0
Daniel Hudsky