it-swarm.com.de

Bash-Argumente zu einer einzelnen Zeichenfolge mit Leerzeichen zusammenfügen

Ich versuche, alle Argumente einer Bash-Funktion zu einer einzigen Zeichenfolge zusammenzufügen, wobei jedes Argument durch Leerzeichen getrennt wird. Ich muss auch die Zeichenfolge in einfache Anführungszeichen um die gesamte Zeichenfolge setzen.

Folgendes habe ich bisher ...

$array=("[email protected]")
str="\'"
for arg in "${array[@]}"; do
    let $str=$str+$arg+" "
done
let $str=$str+"\'"

Natürlich funktioniert das nicht, aber ich frage mich, ob es einen Weg gibt, dies zu erreichen?

46
Schwagmister

Ich glaube, dass dies tut, was Sie wollen. Alle Argumente werden in eine durch Leerzeichen getrennte Zeichenfolge mit einfachen Anführungszeichen gesetzt:

str="'$*'"

$* Erzeugt alle Skriptargumente, die durch das erste Zeichen von $IFS Getrennt sind. Dies ist standardmäßig ein Leerzeichen.

In einer Zeichenfolge mit doppelten Anführungszeichen müssen einfache Anführungszeichen nicht vermieden werden.

Beispiel

Lassen Sie uns das Obige in eine Skriptdatei einfügen:

$ cat script.sh 
#!/bin/sh
str="'$*'"
echo "$str"

Führen Sie nun das Skript mit Beispielargumenten aus:

$ sh script.sh one two three four 5
'one two three four 5'

Dieses Skript ist POSIX. Es funktioniert mit bash, erfordert jedoch kein bash.

Eine Variation: Verketten mit Schrägstrichen anstelle von Leerzeichen

Wir können von Leerzeichen zu einem anderen Zeichen wechseln, indem wir IFS anpassen:

$ cat script.sh 
#!/bin/sh
old="$IFS"
IFS='/'
str="'$*'"
echo "$str"
IFS=$old

Zum Beispiel:

$ sh script.sh one two three four       
'one/two/three/four'
69
John1024

Es ist einfacher als Sie denken:

#!/bin/bash
array="${@}"

echo $array

chmod + x das, und führen Sie es aus:

$ ./example.sh --foo bar -b az 
--foo bar -b az

Update Tl; dr, benutze

"'${array[*]}'"

Um klar zu sein, ich habe nicht vor, diese Antwort zu replizieren. Ich habe gerade festgestellt, dass es geringfügige Unterschiede gibt, @ Und * Zu verwenden, um alle Werte von einem Array zu dereferenzieren.

Unter der Haube sind $* Und [email protected] Alle Arrays, die sich auf die Argv-Liste beziehen.

Aus der Frage,

Ich versuche, alle Argumente mit einer Bash-Funktion zu einer einzelnen Zeichenfolge zu verbinden, wobei jedes Argument durch Leerzeichen getrennt wird.

Es hat 2 Unterfragen:

  1. verketten Sie die Eingabeargumente - Array in einen String.
  2. übergeben Sie die verkettete Zeichenfolge als einzelnes Argument für die Shell-Funktion.

Zuerst Concat-Array in eine Zeichenfolge,

array=("[email protected]")
str="'${array[@]}'"
# or
str="'${array[*]}'"
# or
str=\'"${array[*]}"\'

Zweitens, wenn Sie str an eine Funktion übergeben, zählen wir die Anzahl der Argumente, die diese Funktion empfangen hat.

#!/usr/bin/env bash

arr=(a b c d)

function count_args() {
  echo '$#' $#
}

count_args "'${arr[@]}'"
count_args \'"${arr[@]}"\'
count_args "'${arr[*]}'"
count_args \'"${arr[*]}"\'

ausgabe ist

$# 4
$# 4
$# 1
$# 1

nur arr[*] umschließt das Array mit einem Argument für die Shell-Funktion. Warum?

Zitieren aus Wie man Arrays in Bash-Skripten verwendet , was ich für nützlich hielt,

echo ${array[*]}
echo ${array[@]}

Mit beiden Syntaxen können wir auf alle Werte des Arrays zugreifen und dieselben Ergebnisse erzielen, es sei denn, die Erweiterung ist angegeben. In diesem Fall ergibt sich ein Unterschied: Im ersten Fall führt die Erweiterung bei Verwendung von @ zu einem Word für jedes Element des Arrays.

Während die Verwendung von * Das gesamte Array während der Erweiterung in einem einzigen Argument gruppiert.

0
Izana