Linux script --> hoe behandel ik spaties

Pagina: 1
Acties:

  • fRiEtJeSaTe
  • Registratie: September 2003
  • Laatst online: 30-09 10:11
Ik heb een script geschreven voor mijn de Synology dat de datum toevoegt aan een directory, maar krijg het niet goed werkend als de directory spaties bevat. Is er iemand die hier zijn licht op kan laten schijnen?

rename.sh:
CurrentDir=`pwd`
BaseDir=$(basename "$CurrentDir")
Prefix=${CurrentDir%/*}/
CurrentDate=`date +%Y.%m.%d`
OldLocation=$Prefix$BaseDir
NewLocation=$Prefix$CurrentDate" - "$BaseDir
echo /bin/mv "'"$OldLocation"'" "'"$NewLocation"'"
/bin/mv "'"$OldLocation"'" "'"$NewLocation"'"

sh rename.sh:
/bin/mv '/volume1/downloads/test 2000' '/volume1/downloads/2011.12.15 - test 2000'
mv: can't rename ''/volume1/downloads/test': No such file or directory
mv: can't rename '2000'': Invalid argument
mv: can't rename ''/volume1/downloads/2011.12.15': No such file or directory

Zoals je ziet geeft de echo netjes het juiste commando incl. de apostrofs. Het gekke is, als ik dit commando kopieer en plak, werkt het gewoon 8)7 8)7 8)7

[ Voor 6% gewijzigd door fRiEtJeSaTe op 15-12-2011 15:32 ]


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Die extra aanhalingstekens moeten weg.


Oh ik heb je script nu even in een terminal geplakt en nu zie ik wat je echt doet, en wat echt enorm fout is :P

Je moet gewoon doen mv "bla" "blaat". Niet grappig proberen te doen met aanhalingstekens, gewoon direct zo.

Dus:
Bash:
1
2
3
4
5
6
7
8
CurrentDir=`pwd`
BaseDir=$(basename "$CurrentDir")
Prefix=${CurrentDir%/*}/
CurrentDate=`date +%Y.%m.%d`
OldLocation=$Prefix$BaseDir
NewLocation=$Prefix$CurrentDate" - "$BaseDir
echo /bin/mv "$OldLocation" "$NewLocation"
/bin/mv "$OldLocation" "$NewLocation"

[ Voor 175% gewijzigd door CyBeR op 15-12-2011 15:38 ]

All my posts are provided as-is. They come with NO WARRANTY at all.


  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 15:54

Hero of Time

Moderator LNX

There is only one Legend

Als dat niet werkt, kan je altijd nog de spaties escapen door \ in je variabele te plaatsen voor de spaties. Dit doet dat:
code:
1
2
var1="een variabele"
var2=$(echo $var1 | sed 's/ /\\ /g')

Var1 bevat de gewone spaties, var2 bevat spaties met een escape teken. Als je handmatig via tab-completion de mv zou uitvoeren, zie je namelijk ook de backslashes.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • Steef
  • Registratie: November 2004
  • Laatst online: 27-09 07:32

Steef

GoT's Most Eaten

Hoewel niet direct gerelateerd aan je probleem, dat zou inmiddels verholpen moeten zijn als je de aanwijzingen hierboven hebt gevolgd, wil ik je nog even wijzen op een script header.

Normaal gesproken start je een shell script met iets als:
code:
1
#!/bin/bash


Dit heet een sha-bang en vertelt je systeem welke interpreter moet worden gebruikt om je script uit te voeren.

2 goede BASH scripting guides:
Advanced Bash-Scripting Guide
BASH Programming - Introduction HOW-TO

Succes :) !

Sony A7III | Sony 24 - 105 G | Sigma 100 - 400


Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

ThaRabbit schreef op vrijdag 16 december 2011 @ 18:46:
Dit heet een sha-bang en vertelt je systeem welke interpreter moet worden gebruikt om je script uit te voeren.
Het heet een shebang en het vertelt inderdaad je systeem wat er moet gebeuren. Hij voert zijn script direct met 'sh' uit, en dan is dat niet noodzakelijk.

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • Steef
  • Registratie: November 2004
  • Laatst online: 27-09 07:32

Steef

GoT's Most Eaten

CyBeR schreef op vrijdag 16 december 2011 @ 18:50:
[...]


Het heet een shebang en het vertelt inderdaad je systeem wat er moet gebeuren. Hij voert zijn script direct met 'sh' uit, en dan is dat niet noodzakelijk.
Even mieren-neuken: In de literatuur komt het inderdaad voornamelijk voor als shebang of sh-bang, origineel was het sha-bang als afkorting van de 2 gebruikte tekens: # (sparp) en ! (bang), of hash-bang:

Wikipedia: Shebang (Unix))#Etymology_and_name_history

Maar goed, je hebt gelijk. :Y

[ Voor 4% gewijzigd door Steef op 16-12-2011 19:16 ]

Sony A7III | Sony 24 - 105 G | Sigma 100 - 400


Acties:
  • 0 Henk 'm!

  • johnkeates
  • Registratie: Februari 2008
  • Laatst online: 04-07 16:30
Uh, het was hashbang wat leidde tot shebang. Spreek het maar eens uit :) Als je dan de ha- van hash niet uitspreekt ben je er al!

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Wat een quatsch zie ik hier passeren.

Om spaties in variabelen toe te staan gebruik je aanhalingstekens:
Bash:
1
2
3
4
SPACES="blah blah"
echo "$SPACES"
mv "$SPACES" "/tmp"
ls "$SPACES"


Anders gaat je shell te variabelen op spaties delimiten en krijg je fouten. Het is zowiezo good practice om aanhalingstekens rond variabelen te zetten mbt security etc.

Raad eens wat dit doet:
Bash:
1
2
read VAR
rm -Rf $VAR

bij de input "myFile.txt /"

ASSUME makes an ASS out of U and ME

Pagina: 1