2016-10-19 2 views
0

Ich versuchte, die xargs zu verwenden, um die Argumente an die echo weitergeben müssen:wie „ein“ Argument übergeben und es zweimal in „xargs“ Befehl

[[email protected] scripts]$ echo {0..4} | xargs -n 1 echo 
0 
1 
2 
3 
4 

die versicherten -n 1 dass der xargs Pass 1 Argumente ein Zeit zum echo.

Dann möchte ich dieses aruments zweimal verwenden, aber die Ergebnisse nicht ich wollte:

[[email protected] scripts]$ echo {0..4} | xargs [email protected] -n 1 echo @,@ 
0 1 2 3 4,0 1 2 3 4 

die -n 1 deaktiviert scheint, wenn ich die [email protected] hinzugefügt, und das ist das Ergebnis, das ich wollte:

0,0 
1,1 
2,2 
3,3 
4,4 

Wie kann ich das erreichen?

-------- Versorgung ------------------ Ich habe die von @ 123 empfohlene Methode verwendet, es gibt jedoch noch eine andere Frage:

test.sh:

#!/bin/bash 
a[0]=1 
a[1]=2 
echo "a[0] and a[1] : "${a[0]}, ${a[1]} 
echo -n {0..1} | xargs -I num -d" " echo num,${a[num]},num 

und dies ist die Ausgabe:

[[email protected] scripts]$ sh test.sh 
a[0] and a[1] : 1, 2 
0,1,0 
1,1,1 

Sie können sehen, dass das Array a nicht den Wert zurück ich wollte: < Und wie kann ich dieses Problem beheben?

+2

'echo -n {0..4} | xargs -I @ -d '' echo @, @ '? 'printf"% s \ n "{0..4} | xargs -I @ echo @, @ '? – 123

+0

Könntest du dir diese Frage mal anschauen? Es gibt noch einige Fragen bei der Verwendung der Argumente: (@ 123 –

+0

Shell-Erweiterung tritt auf, bevor Xargs es jemals sehen, so wird es immer als '$ {a [num]}' aka '$ {a [0]}' etwas albernes wie 'xargs -I num -d" "bash -c 'echo $ num'" $ {a [@]} "aber es gibt wahrscheinlich einen besseren Weg, um zu erreichen, was auch immer dein Endziel ist. – 123

Antwort

3

Wenn Sie nicht das Eingabeformat ändern, können Sie das Trennzeichen in einen Raum gesetzt:

$ echo -n {0..4} | xargs -d " " [email protected] echo @,@ 
0,0 
1,1 
2,2 
3,3 
4,4 

Andernfalls ändern Sie den Eingang die Token mit einem Newline zu trennen:

$ printf "%s\n" {0..4} | xargs [email protected] echo @,@ 
0,0 
1,1 
2,2 
3,3 
4,4 

der Grund für diese Syntax erklärt in man xargs

-I replace-str 

Replace occurrences of replace-str in the initial-arguments with names read from 
standard input. Also, unquoted blanks do not terminate input items; instead the sep‐ 
arator is the newline character. Implies -x and -L 1. 

So müssen Sie die de gesetzt Beschränken Sie manuell auf ein Leerzeichen, wenn Sie Felder abgrenzen möchten.

+0

Vielleicht fügen Sie eine Erklärung, warum OPs nicht funktioniert. – 123

+0

@ 123: Ich bin mir nicht ganz sicher, warum die OP-Version nicht funktioniert. Anscheinend teilt 'xargs' die Eingabezeile in Whitespaces auf, wenn die Option '-I' nicht verwendet wird, aber mit' -I' behandelt sie die Zeile als ein Argument. Ich konnte keine gute Erklärung dafür in der Manpage finden ... – user000001

+1

Unter '-I'>' Auch nicht angeführte Leerzeichen machen keine Eingabeelemente; Stattdessen ist das Trennzeichen der Newline-Zeichen. – 123

Verwandte Themen