1

I have a script, which will parse an array like:

#!/bin/bash
URLs=(
...
"https://www.example.com"
"https://www.example.com/contact"
);
for URL in ${URLs[*]} ; ...

Now what I'm trying to do is to outsource the URLs array into another file, pass that file as $1 and source it (source $1) into my script. Unfortunately URLs stays empty.

This is the file with the outsourced URLs array, which I'm trying to pass:

#!/bin/bash
URLs=(
...
"https://www.example.com"
"https://www.example.com/contact"
);

I'm calling the script like this:

./original.sh /absolute/path/to/array.sh

And, of course the original.sh:

#!/bin/bash
source $1;
for URL in ${URLs[*]} ; ...
# e.g. curl ${URL}
# Tried also:
for URL in ${URLs[@]} ; ...

The idea is that I have different lists/files with URLs, which need to be passed to one single script in order to be parsed. Does anyone has an idea how I could do that?

closed as off-topic by terdon Apr 5 at 12:35

This question appears to be off-topic. The users who voted to close gave this specific reason:

  • "Questions describing a problem that can't be reproduced and seemingly went away on its own (or went away when a typo was fixed) are off-topic as they are unlikely to help future readers." – terdon
If this question can be reworded to fit the rules in the help center, please edit the question.

  • 1
    Works fine for me. Please edit your question and add your full (minimal) working script. Generally, you should use "${URLs[@]}". See this – pLumo Apr 5 at 11:55
  • You did that from an external file, where URLs is kept? If you trigger it in the same file, it works for me, too. – chevallier Apr 5 at 11:57
  • yes, from an external file. – pLumo Apr 5 at 11:57
  • What does your file look like that you're trying to source? – Kusalananda Apr 5 at 11:58
  • @Kusalananda: It starts with #!/bin/bash and is followed by the array declaration URLs=( ... );. – chevallier Apr 5 at 12:03
2

I don't see any issue in your script, it works for me, although you should always use quoted "${var[@]}" notation and also use quotes around variables / file names (source "$1").


This works well:

script array.sh:

#!/bin/bash
URLs=(
"example"
"something"
"something else"
)

script original.sh:

#!/bin/bash
source "$1"
for URL in "${URLs[@]}"; do
    echo "$URL"
done

works well for me:

$ ./original.sh array.sh
example
something
something else

Easier solution of loading list data without needing to source using readarray:

config:

example
something
something else

script:

readarray URLs < config
for URL in "${URLs[@]}"; do
    echo "$URL"
done

or using xargs:

 xargs -a config -I{} echo {}

or feed it directly into wget or aria2c if your goal is to download the urls:

wget -i config
aria2c -i config
  • Yes, of course it works, I had a very strupid mistake I overlooked, sorry for that and thank you for your efforts. – chevallier Apr 5 at 12:17
  • Nevermind, mistakes happen to everyone. And the most stupid mistakes are the most difficult to see. Would you tell us what the mistake was? – pLumo Apr 5 at 12:18
  • If I tell you, you will kill me :) I forgot to remove an exit, which I have placed at the beginning where I performed some tests in order not to trigger the remaining execution of the script. I recognized it as I triggered the script with /bin/bash -x - I'm very sorry! Sh** happens ))))) – chevallier Apr 5 at 12:21

Not the answer you're looking for? Browse other questions tagged or ask your own question.