anurag
anurag

Reputation: 137

"not found" error in shell script

I am trying to write a script that should take values from a xml file.

Here is the xml file :-

`<manifestFile>
  <productInformation>
      <publicationInfo>
         <pubID pcsi-selector="P.S.">PACODE</pubID>
      <pubNumber/>
     </publicationInfo>
  </productInformation>
</manifestFile>`

and i my code is :-

#!/bin/sh

Manifest=""
Manifest= `/bin/grep  'pcsi-selector="'  /LDCManifest.xml | cut  -f 2 -d '"'`
echo $Manifest

I expect my result to be P.S. , but it keeps throwing error as :-

  ./abc.sh: P.S.: not found

I am new to shell and i am not able to figure out whats the error here ?

Upvotes: 0

Views: 932

Answers (2)

Mark Reed
Mark Reed

Reputation: 95252

You can't have a space after the =.

When you run this command:

Manifest= `/bin/grep  'pcsi-selector="'  /LDCManifest.xml | cut  -f 2 -d '"'`

It's the same as this:

Manifest='' `/bin/grep  'pcsi-selector="'  /LDCManifest.xml | cut  -f 2 -d '"'`

That tells the shell to

  1. Run the grep command.
  2. Take its output
  3. Run that output as a command, with the environment variable Manifest set to the empty string for the duration of the command.

Get rid of the space after the = and you'll get the result you want.

However, you should also avoid using backticks for command substitution, because they interfere with quoting. Use $(...) instead:

Manifest=$(grep 'pcsi-selector="' /LDCManifest.xml | cut -f2 -d'"')

Also, using text/regex-based tools like grep and cut to manipulate XML is clunky and error-prone. You'd be better off installing something like XMLStarlet:

 Manifest=$(xmlstarlet sel -t \
  -v '/manifestFile/productInformation/publicationInfo/pubID/@pcsiselector' -n \
  /LDCManifest.xml)

Upvotes: 2

clt60
clt60

Reputation: 63902

Or simpler:

grep -oP 'pcsi-selector="\K[^"]+' /LDCManifest.xml

would print

P.S.

assign

Manifest=$(grep -oP 'pcsi-selector="\K[^"]+' /LDCManifest.xml)

Upvotes: 1

Related Questions