Syntax error in Bash script

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • TheRicolaa10
  • Registratie: Juni 2012
  • Laatst online: 18:38
Hallo,

Ik ben voor een school opdracht bezig met een shell script die alle duplicaten bestanden vindt door middel van een shasum. Er moet tevens ook een optie ingebouwd worden om bestanden te negeren. Echter krijg ik de volgende error: find: paths must precede expression. Als ik hierop zoek op Stackoverflow dan word me verteld dat ik enkele quotes om de zoekterm moet doen.

code:
1
2
3
4
5
excludeFiles=""
for ef in "${eFiles[@]}";
do
   excludeFiles="$excludeFiles ! -name $ef";
done


Find statement:
code:
1
subFiles=`find $path -type f ! -path $f $excludeFiles`;


Ik heb al van alles geprobeerd, enkele quotes om de $ef, escaping, curly braces rondom $ef (Dit dus ${ef}).

Hebben jullie een idee hoe ik dit kan oplossen?

Alvast bedankt!

DJI Mavic 3 Classic | i7-8700 - GTX1070Ti - 16GB RAM

Alle reacties


Acties:
  • 0 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Enkele quotes en geen backticks gebruiken misschien?

Acties:
  • 0 Henk 'm!

  • DeBolle
  • Registratie: September 2000
  • Laatst online: 21:49

DeBolle

Volgens mij ligt dat anders

Waarom backticks in subFiles en ${} in de for loop? Tweedens, waar komt de inhoud van excludeFiles vandaan?

Specs ... maar nog twee jaar zes maanden en dan weer 130!


Acties:
  • 0 Henk 'm!

  • TheRicolaa10
  • Registratie: Juni 2012
  • Laatst online: 18:38
downtime schreef op zondag 7 april 2019 @ 11:49:
Enkele quotes en geen backticks gebruiken misschien?
Je bedoelt in het find commando?
DeBolle schreef op zondag 7 april 2019 @ 11:49:
Waarom backticks in subFiles en ${} in de for loop? Tweedens, waar komt de inhoud van excludeFiles vandaan?
De inhoud van excludeFiles is een array die wordt meegegeven als een parameter bij een option (-x in dit geval). Ik heb de backtiks toegevoegd omdat het een commando moet zijn dat die moet uitvoeren (correct me if I'm wrong).

[ Voor 54% gewijzigd door TheRicolaa10 op 07-04-2019 11:54 ]

DJI Mavic 3 Classic | i7-8700 - GTX1070Ti - 16GB RAM


Acties:
  • 0 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

TheRicolaa10 schreef op zondag 7 april 2019 @ 11:49:
[...]


Je bedoelt in het find commando?
Yep.

Acties:
  • +1 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 21:04
Enkele quotes lijkt me niet heel zinvol. Je kunt wel (tijdelijk) dubbele quotes gebruiken om het commando (na parameter expansion) niet direct uit te voeren maar eerst te printen en te bekijken. Maar je kunt ook set -x of set -v gebruiken om te debuggen. Trouwens, $() is een moderner alternatief voor backticks (die site bevat ook andere nuttige info over shell scripten).

Maar zo delen van commando's opbouwen in een string is vragen om moeilijkheden (of eval) zodra er spaties e.d. in voor kunnen komen. Want je hebt een reeks van statements met herhaaldelijke parameter expansions waarbij sommige spaties later weer als scheiding tussen argumenten herkend moeten worden, terwijl anderen onderdeel zijn van een argument. Je gebruikt al een array voor eFiles; doe dat dan ook voor excludeFiles. Elk (extra) argument voor find wordt een element in die array. Dan hoef je er alleen nog maar op te letten dat je individuele argumenten correct quotet bij het bouwen van de array:
Bash:
1
excludeFiles+=(! -name "$ef")

En dan (met weer netjes de parameter expansions binnen quotes):
Bash:
1
subFiles=$(find "$path" -type f ! -path "$f" "${excludeFiles[@]}")
Pagina: 1