Bash Scripting: Parameter der mit Leerzeichen getrennt ist als ein Parameter interpretieren

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Cordess
Beiträge: 422
Registriert: 09.01.2006 00:37:22

Bash Scripting: Parameter der mit Leerzeichen getrennt ist als ein Parameter interpretieren

Beitrag von Cordess » 06.08.2023 09:24:22

Ich möchte in einem BASH Script den Inhalt mehrerer Variablen zu einer Variable zusammenfassen und diese eine Variable an ein Programm übergeben, welches den Inhalt der Variable als ein Parameter erwartet.

Das Problem ist dabei, dass sich in der Variable ein Leerzeichen befindet, was dazu führt, dass es als zwei Parameter interpretiert wird.

Ich habe dazu in C ein kleines Testtool "check.c" mit folgendem Inhalt geschrieben:

Code: Alles auswählen

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* Compilieren mit:
   gcc check.c -o check.bin
*/

int main(int argc, char *argv[])
{
  printf("argc = %i\n", argc);

  if (argc != 2)
  {
    if (argv[1] != "")
    {
      printf("argv[1] = %s\n", argv[1]);
    }
    printf("Usage: check 'a b'\n");
    exit(0);
  }
  printf("argv[1] = %s\n", argv[1]);
  return 0;
}
Das Programm prüft, ob ein Parameter übergeben wurde, sind es mehr oder weniger, dann bricht das Programm mit einer Usage Meldung ab.

In der Konsole kann ich jetzt diesem Programm einen Parameter, der aus zwei Strings und einem Leerzeichen besteht, mit den Hochkommas ' so übergeben, dass die Eingabe als 1 Parameter, und nicht zwei Parameter interpretiert wird.
Beispielausgabe:

Code: Alles auswählen

$ ./check.bin 'aa bb'
argc = 2
argv[1] = aa bb
Und ohne Hochkomma, wird es als zwei Parameter interpretiert und es kommt wie erwartet die Usage Meldung:

Code: Alles auswählen

./check.bin aa bb
argc = 3
argv[1] = aa
Usage: check 'a b'

Nun möchte ich das Programm von einem BASH Skript namens checktest.sh aus aufrufen und den zu übergebenden Parameter, zuerst aus dem Inhalt zweiter Variablen zusammensetzen.
Und das Problem ist jetzt hier, dass das mit dem Hochkomma nicht mehr klappt, da der Variableninhalt dann nicht ausgewertet wird.

Code: Alles auswählen

#!/bin/bash

param_1=aa
param_2=bb
gesamt="$param_1 $param_2"
echo $gesamt
./check.bin '$gesamt'
Die Ausgabe ist bei diesem Skript somit:

Code: Alles auswählen

./checktest.sh 
aa bb
argc = 2
argv[1] = $gesamt
Ich habe schon verschiedene Varianten durchprobiert, in dem ich die $gesamt Variable bspw. in `` oder {} einpacke, aber nichts davon funktioniert.

Code: Alles auswählen

# im Skript
./check.bin `$gesamt`
# oder:
./check.bin  { $gesamt }
Wie kann das gelöst werden?

tobo
Beiträge: 1996
Registriert: 10.12.2008 10:51:41

Re: Bash Scripting: Parameter der mit Leerzeichen getrennt ist als ein Parameter interpretieren

Beitrag von tobo » 06.08.2023 09:37:35

Variablen sollten beim Lesen, wenn nichts dagegen spricht, immer in "$var" gesetzt werden.

Code: Alles auswählen

$ cat checktest.sh 
#!/bin/bash

param_1=aa
param_2=bb
gesamt="$param_1 $param_2"
echo "$gesamt"
./check.bin "$gesamt"
$ ./checktest.sh 
aa bb
argc = 2
argv[1] = aa bb
$
Wobei ich mir allerdings nicht sicher bin, ob das die Ausgabe ist, du haben willst.

Cordess
Beiträge: 422
Registriert: 09.01.2006 00:37:22

Re: Bash Scripting: Parameter der mit Leerzeichen getrennt ist als ein Parameter interpretieren

Beitrag von Cordess » 06.08.2023 09:42:03

Besten Dank, das ist genau das wonach ich gesucht habe. :THX:
Mit den Anführungszeichen "" bei der Übergabe der Variable an das Programm klappt es.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash Scripting: Parameter der mit Leerzeichen getrennt ist als ein Parameter interpretieren

Beitrag von Meillo » 06.08.2023 09:50:28

Das genau ist der Unterschied zwischen Single-Quotes ('...') und Double-Quotes ("..."): In ersteren bleibt der Inhalt 1:1 erhalten, in zweiteren wird zwar Whitespace geschuetzt aber Variablen werden expandiert (d.h. ersetzt). Insofern der Inhalt der Quotes keine Sonderzeichen enthaelt ist es egal welche du verwendest, aber sobald Dollarzeichen drin sind muss man diejenigen verwenden, die das machen was man eben haben will. Z.B.:

Code: Alles auswählen

currency="Dollar"
echo "Es kostet 10 $currency heute."
echo 'Es kostet 10 $ heute.'
Use ed once in a while!

tobo
Beiträge: 1996
Registriert: 10.12.2008 10:51:41

Re: Bash Scripting: Parameter der mit Leerzeichen getrennt ist als ein Parameter interpretieren

Beitrag von tobo » 06.08.2023 09:58:11

Es gibt noch weitere Metazeichen, die innerhalb doppelter " ihre Sonderbedeutung behalten:
https://www.gnu.org/software/bash/manua ... uotes.html

Antworten