Es ist mit einem Platzhalter

7

Dies funktioniert vom Terminal aus:

ls /dev/sda*

Ich möchte es in einem Bash-Skript mit einer Variablen. Ich habe es versucht:

device="a"
ls "/dev/sd"$device"*"

Aber ich bekomme den Fehler : ls: cannot access '/dev/sda*': No such file or directory.

lonix
quelle

Antworten:

11
ls /dev/sd$device* # or
ls "/dev/sd$device"*

Sie dürfen die Globbing-Metazeichen nicht zitieren, wenn Globbing durchgeführt werden soll.

Hauke ​​Laging
quelle
2
Das Zitat im Original ist fast genau rückwärts. Sie können keine Platzhalter zitieren, die Sie erweitern möchten. Sie sollten Variablenreferenzen zitieren, um eine unerwartete Wortteilung und Platzhaltererweiterung zu vermeiden. Das Zitieren fester Zeichenfolgen, die keine Shell-Metazeichen enthalten, spielt keine Rolle. Das Original hatte den Platzhalter in Anführungszeichen und die Variablenreferenz nicht in Anführungszeichen gesetzt. Beide sollten umgekehrt werden (wie bei der zweiten Option in dieser Antwort). Übrigens ls /dev/sd"$device"*wäre auch in Ordnung, da /dev/sd/es keine Metazeichen enthält.
Gordon Davisson
2
Auch Globbing und Zitate werden in der Shell gemacht, lsweiß nichts über sie.
Strg-Alt-Delor
Komisch, variable Zuordnung funktioniert so , dass Sie kann schreiben: device=sda*; ls /dev/$deviceund glob Expansion nach der Variablensubstitution erhalten.
Alexis
8

Die doppelten Anführungszeichen weisen die Shell an, den Ist-Zustand zu belassen, *anstatt ihn zu erweitern. Das wird funktionieren:

device="a"
ls "/dev/sd${device}"*
Stephen Kitt
quelle