Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[bash] $@ issue

7 views
Skip to first unread message

Richard Lucassen

unread,
Dec 1, 2011, 3:21:16 AM12/1/11
to
$@ bestaat uit meerdere space separated values:

Waarom werkt dit niet:

metaflac --set-tag=${FIELD}="$@" *.flac

metaflac gaat namelijk zeuren:
ERROR: reading metadata, status =
"FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE"
Kennelijk wordt het tweede argument in $@ als nieuwe file gezien.

Maar waarom wel als ik $@ eerst aan een variabele voer met ""?:

VALUE="$@"
metaflac --set-tag=${FIELD}="${VALUE}" *.flac

Het zit dus vast in die "" achter VALUE="$@", maar waarom is dat dan?

R.

--
___________________________________________________________________
It is better to remain silent and be thought a fool, than to speak
aloud and remove all doubt.

+------------------------------------------------------------------+
| Richard Lucassen, Utrecht |
| Public key and email address: |
| http://www.lucassen.org/mail-pubkey.html |
+------------------------------------------------------------------+

Pyt T.

unread,
Dec 1, 2011, 6:28:34 AM12/1/11
to
On Thu, 1 Dec 2011 09:21:16 +0100, Richard Lucassen <ne...@xaq.nl> wrote:
> $@ bestaat uit meerdere space separated values:
>
> Waarom werkt dit niet:
>
> metaflac --set-tag=${FIELD}="$@" *.flac
>
> metaflac gaat namelijk zeuren:
> ERROR: reading metadata, status =
> "FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE"
> Kennelijk wordt het tweede argument in $@ als nieuwe file gezien.
>
> Maar waarom wel als ik $@ eerst aan een variabele voer met ""?:
>
> VALUE="$@"
> metaflac --set-tag=${FIELD}="${VALUE}" *.flac
>
> Het zit dus vast in die "" achter VALUE="$@", maar waarom is dat dan?
>
> R.
>

Dit lijkt me het proberen waard:

robert

unread,
Dec 1, 2011, 7:00:18 AM12/1/11
to
Richard Lucassen <ne...@xaq.nl>:
> $@ bestaat uit meerdere space separated values:
>
> Waarom werkt dit niet:
>
> metaflac --set-tag=${FIELD}="$@" *.flac

$@ tussen double quotes is iets speciaals:
"When the expansion occurs within double quotes, each parameter expands to
a separate word." (man bash)

In jouw voorbeeld gebeurt dus het volgende:
metaflac --set-tag=${FIELD}="VALUE1" "VALUE2" "VALUE3" *.flac

Wat je, denk ik, wilt is dit:
metaflac --set-tag=${FIELD}="'$@'" *.flac

Of misschien dit:
metaflac --set-tag=${FIELD}="$*" *.flac

> metaflac gaat namelijk zeuren:
> ERROR: reading metadata, status =
> "FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE"
> Kennelijk wordt het tweede argument in $@ als nieuwe file gezien.
>
> Maar waarom wel als ik $@ eerst aan een variabele voer met ""?:
>
> VALUE="$@"
> metaflac --set-tag=${FIELD}="${VALUE}" *.flac
>
> Het zit dus vast in die "" achter VALUE="$@", maar waarom is dat dan?

Uh...

--
robert

Richard Lucassen

unread,
Dec 4, 2011, 1:19:04 PM12/4/11
to
On 01 Dec 2011 11:28:34 GMT
"Pyt T." <py...@gmail.com.invalid> wrote:

> > $@ bestaat uit meerdere space separated values:
> >
> > Waarom werkt dit niet:
> >
> > metaflac --set-tag=${FIELD}="$@" *.flac
> >
> > metaflac gaat namelijk zeuren:
> > ERROR: reading metadata, status =
> > "FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE"
> > Kennelijk wordt het tweede argument in $@ als nieuwe file gezien.
> >
> > Maar waarom wel als ik $@ eerst aan een variabele voer met ""?:
> >
> > VALUE="$@"
> > metaflac --set-tag=${FIELD}="${VALUE}" *.flac
> >
> > Het zit dus vast in die "" achter VALUE="$@", maar waarom is dat
> > dan?
>
> Dit lijkt me het proberen waard:
> metaflac --set-tag=${FIELD}=\"$@\" *.flac

Helaas, zelfde resultaat :(

Richard Lucassen

unread,
Dec 4, 2011, 1:20:46 PM12/4/11
to
On 01 Dec 2011 12:00:18 GMT
US3N37+{n.c.o.l.p}@gmail.com (robert) wrote:

> > Waarom werkt dit niet:
> >
> > metaflac --set-tag=${FIELD}="$@" *.flac
>
> $@ tussen double quotes is iets speciaals:
> "When the expansion occurs within double quotes, each parameter
> expands to a separate word." (man bash)
>
> In jouw voorbeeld gebeurt dus het volgende:
> metaflac --set-tag=${FIELD}="VALUE1" "VALUE2" "VALUE3" *.flac

ok, die had ik gemist inderdaad.

> Wat je, denk ik, wilt is dit:
> metaflac --set-tag=${FIELD}="'$@'" *.flac
>
> Of misschien dit:
> metaflac --set-tag=${FIELD}="$*" *.flac

Nope. Helaas zelfde error...

> > metaflac gaat namelijk zeuren:
> > ERROR: reading metadata, status =
> > "FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE"
> > Kennelijk wordt het tweede argument in $@ als nieuwe file gezien.
> >
> > Maar waarom wel als ik $@ eerst aan een variabele voer met ""?:
> >
> > VALUE="$@"
> > metaflac --set-tag=${FIELD}="${VALUE}" *.flac
> >
> > Het zit dus vast in die "" achter VALUE="$@", maar waarom is dat
> > dan?
>
> Uh...

Tsja, dat blijft de vraag. het werkt wel. Misschien loop ik tegen een
bug aan, maar ik zal dan niet de enige mogen zijn...

robert

unread,
Dec 4, 2011, 2:05:01 PM12/4/11
to
Richard Lucassen <ne...@xaq.nl>:
> On 01 Dec 2011 12:00:18 GMT
> US3N37+{n.c.o.l.p}@gmail.com (robert) wrote:
>
>> > Waarom werkt dit niet:
>> >
>> > metaflac --set-tag=${FIELD}="$@" *.flac
>>
>> $@ tussen double quotes is iets speciaals:
>> "When the expansion occurs within double quotes, each parameter
>> expands to a separate word." (man bash)
>>
>> In jouw voorbeeld gebeurt dus het volgende:
>> metaflac --set-tag=${FIELD}="VALUE1" "VALUE2" "VALUE3" *.flac
>
> ok, die had ik gemist inderdaad.
>
>> Wat je, denk ik, wilt is dit:
>> metaflac --set-tag=${FIELD}="'$@'" *.flac
>>
>> Of misschien dit:
>> metaflac --set-tag=${FIELD}="$*" *.flac
>
> Nope. Helaas zelfde error...

In je eerste posting schreef je dit: "$@ bestaat uit meerdere space
separated values". Is dat echt zo? Want normaal gesproken is $@ een
array met de argumenten van het script:

$ bash -c 'echo $@, $#' -- one two three
one two three, 3
$ bash -c 'echo $@, $#' -- 'one two' three
one two three, 2

Het lijken dus space separated values te zijn als je ze echoot, maar in het
laatste geval zijn er maar twee argumenten zoals de teller laat zien.

Ik weet nog even niet of het iets zou moeten uitmaken... :)

--
robert

Richard Lucassen

unread,
Dec 5, 2011, 4:25:07 AM12/5/11
to
On 04 Dec 2011 19:05:01 GMT
Volgens mij is "'one two'" inderdaad maar 1 parameter. Ik gebruik dat
in het script soms als er tekens in staan waar de shell mee aan de haal
gaat. Maar het blijft idioot dat als ik het eerst aan een var voer en
daar dan vervolgens bij het uitlezen ervan "" omheen zet, dat het dan
wel goed gaat.

Overigens haal ik er met "shift" een variabele uit in het begin, zou
dat wat uitmaken? (IMHO niet eigenlijk)

R.

Wil Taphoorn

unread,
Dec 5, 2011, 6:56:10 AM12/5/11
to
On 4-12-2011 19:20, Richard Lucassen wrote:
> On 01 Dec 2011 12:00:18 GMT
> US3N37+{n.c.o.l.p}@gmail.com (robert) wrote:
>
>> Of misschien dit:
>> metaflac --set-tag=${FIELD}="$*" *.flac
>
> Nope. Helaas zelfde error...

Dat zou gewoon moeten werken.

Stuur het maar eens naar een dummy die slechts zijn
argumenten laat zien:

$ cat metaflagdummy
#!/bin/bash
for i in "$@"; do echo $i; done

En dan een stukje uit jou script:

$ cat richard
#!/bin/bash
FIELD=ALBUM
shift
./metaflagdummy --set-tag=${FIELD}="$*" *.flac

Als ik dat aanroep (met "niks" voor de shift) dan zie
ik de argumenten zoals ze (denk ik) bedoeld zijn.

$ ./richard niks Dit album
--set-tag=ALBUM=Dit album
dropouts.flac
test.flac
test-3-flac-16-44100.flac
test-5-flac-24-44100.flac
tone24bit.flac


--
Wil

Richard Lucassen

unread,
Dec 6, 2011, 4:58:10 AM12/6/11
to
Hmm. Zo roep ik 'm aan:

metaflac --set-tag=${FIELD}="$@" *.flac

En als ik 'm met $* aanroep dan gaat het wel goed:

metaflac --set-tag=${FIELD}="$*" *.flac

Toch niet goed "man bash" geinterpreteerd dus. Ik ging er vanuit dat $*
alle argumenten zou bevatten, maar de shift gooit 'm er daar ook al
uit. Vandaar dat ik $@ gebruikte.

R.
0 new messages