2016-08-09 3 views
0

Ich habe ein Bash-Skript wie folgt aus:Wie macht man Bash-Skript Dateinamen mit Leerzeichen?

myfiles=("file\ with\ spaces.csv") 

for file_name in "${myfiles[@]}" 
do 
     echo "removing first line of file $file_name" 
     echo "first line is `head -1 $file_name`" 
     echo "\n" 
done 

aber es ist nicht die Räume aus irgendeinem Grund nicht erkennt, obwohl ich es in doppelte Anführungszeichen "" eingeschlossen:

head: cannot open ‘file\\’ for reading: No such file or directory 

Wie kann ich dieses Problem beheben ?

Antwort

4

Sie brauchen doppelte Anführungszeichen in den Backticks. Die äußere Menge ist nicht ausreichend.

Setzen Sie auch keine Backslashes in den Dateinamen, da es bereits zitiert wird. Zitate oder Backslashes, aber nicht beides.

myfiles=("file with spaces.csv") 
myfiles=(file\ with\ spaces.csv) 
1

erweitern auf @JohnKugelman's answer:

  • Quoting dauert ein wenig in Bash gewöhnungsbedürftig. Als einfache Regel verwenden Sie einfache Anführungszeichen für statische Strings ohne Sonderzeichen, doppelte Anführungszeichen für Strings mit Variablen und $'' für Strings mit Sonderzeichen.
  • Innerhalb jeder command substitution gibt es einen separaten Zitatkontext.
  • $() ist eine klarere Möglichkeit, eine Befehlsersetzung einzurichten, da es viel einfacher verschachtelt werden kann.

Folglich würden Sie normalerweise myfiles=('file with spaces.csv') und echo "first line is $(head -1 "$file_name")" schreiben.

Verwandte Themen