<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Jul 27, 2016 at 2:48 PM, Johnny Rosenberg <span dir="ltr"><<a href="mailto:gurus.knugum@gmail.com" target="_blank">gurus.knugum@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">2016-07-27 19:08 GMT+02:00 Jared Greenwald <span dir="ltr"><<a href="mailto:greenwaldjared@gmail.com" target="_blank">greenwaldjared@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">The problem you have is that of namespace.  Even though you're declaring the "FileName" variable within ToURI as a local, you're also declaring it in the global context in the (now disabled) line.  It wouldn't necessarily be a problem, but you're declaring FileName as an array in the global context, so when you go to use it the ToURI context, bash basically doesn't know what to do with an assignment to an array without a positional reference.  Basically, you *could* override the global value in ToURI if you wanted to by using a positional reference (eg [1]) or remove the positional reference in the global context. My best suggestion would be to just change the local variable name in ToURI to something that doesn't collide with the global namespace.</div></blockquote><div><br></div><div>I think I see what you mean.</div><div>About the array thing, I actually found later that replacing <b style="color:rgb(80,0,80);font-family:monospace,monospace;font-size:x-small">FileName[1]=$(basename "${File[1]}") with </b><b style="color:rgb(80,0,80);font-family:monospace,monospace;font-size:x-small">FileName=$(basename "${File[1]}") </b>worked too, and that was also my first solution, giving a slightly slower script, not noticeable though.</div></div></div></div></blockquote><div><br></div><div>Without the context of the larger script, it's hard to say what might be causing the issue.  The small snippet doesn't really justify to me the use of an array, but the larger context might.  In the past, I've only really used arrays in bash when it was absolutely necessary since there are plenty of other ways to skin that cat.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><br></div><div>Having another look at my ToURI function, I'm also wondering if ”<font size="1" face="monospace, monospace"><b>export local</b></font>” is meaningful. Sounds like a contradiction… But I need the export for the perl thing at the end of the function, I don't think it will work otherwise.</div></div></div></div></blockquote><div><br></div><div>I doubt that it has any implication.  The "export" is really the only thing you needed there I think and as someone else pointed out, you can just do it in one line.  Cleaner and more concise. </div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><br></div><div>However, I replaced FileName in the ToURI function with InputFile and it seems to work now.</div></div></div></div></blockquote><div><br></div><div>Yea, really anything would have worked there as long as it wasn't FileName.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div>Thank you very much for your input. I guess I should have understood this myself, but I'm good at other things… :P</div></div></div></div></blockquote><div><br></div><div>I'm certainly no expert in bash.  As shown by the fact that others pointed out things I didn't see.  The only way to learn and make better code is to try what you know and then get input and advice from others.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><br></div><div><br></div><div><div>Kind regards</div><div><br></div><div>Johnny Rosenberg</div></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class="gmail_extra"><br><div class="gmail_quote"><div><div>On Wed, Jul 27, 2016 at 11:59 AM, Johnny Rosenberg <span dir="ltr"><<a href="mailto:gurus.knugum@gmail.com" target="_blank">gurus.knugum@gmail.com</a>></span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div><div dir="ltr"><span style="font-size:12.8px">Hi!</span><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">I really really don't understand what's going on here. I have a rather big script and there is something that doesn't work properly, and after hours of debugging, I found the problem line.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Since the script is very big, 19 files at the moment, I made a shorter example that has exactly the same problem. Here it is:</div><div style="font-size:12.8px"><br></div><div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b>#!/bin/bash</b></font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b><br></b></font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b>FullPathName() {</b></font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b><span style="white-space:pre-wrap">      </span># Declare local variables</b></font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b><span style="white-space:pre-wrap">        </span>local Path="$1"</b></font></div><div style="font-size:12.8px"><span style="white-space:pre-wrap"><font face="monospace, monospace" size="1"><b>        </b></font></span></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b><span style="white-space:pre-wrap"> </span>if [[ ${Path:0:1} != / ]]; then<span style="white-space:pre-wrap"> </span># Relative path.</b></font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b><span style="white-space:pre-wrap">         </span>echo "${PWD}/${Path}"</b></font></div><div style="font-size:12.8px"><font size="1"><b><font face="monospace, monospace"><span style="white-space:pre-wrap">      </span>else</font><span style="font-family:monospace,monospace;white-space:pre-wrap">       </span><span style="font-family:monospace,monospace;white-space:pre-wrap">        </span><span style="font-family:monospace,monospace;white-space:pre-wrap">        </span><span style="font-family:monospace,monospace;white-space:pre-wrap">        </span><span style="font-family:monospace,monospace"># Absolute path.</span></b></font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b><span style="white-space:pre-wrap">              </span>echo "${Path}"</b></font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b><span style="white-space:pre-wrap"> </span>fi</b></font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b>}</b></font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b><br></b></font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b>ToURI () {</b></font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b><span style="white-space:pre-wrap">     </span># Declare local variables.</b></font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b><span style="white-space:pre-wrap">       </span>export local FileName="$1"</b></font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b><span style="white-space:pre-wrap">     </span>perl -MURI::file -e 'print URI::file->new($ENV{'FileName'})."\n"'</b></font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b>}</b></font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b><br></b></font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b>File[1]=$(FullPathName "${1}")</b></font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b>FileName[1]=$(basename "${File[1]}")</b></font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b><br></b></font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b>SelectedProject="Projekt Johnny Guitar"</b></font></div><div><font face="monospace, monospace" size="1"><b>RemoteRootFolder="<a href="http://web.comhem.se/something" target="_blank">http://web.comhem.se/something</a>"</b></font></div><div style="font-size:12.8px"><b style="font-family:monospace,monospace;font-size:x-small">RemoteProjectFolder="${RemoteRootFolder}/"$(ToURI "${SelectedProject}")</b><br></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b><br></b></font></div><div style="font-size:12.8px"><font face="monospace, monospace" size="1"><b>echo "${RemoteProjectFolder}"</b></font></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">as you can see, the <b><font size="1" face="monospace, monospace">File</font></b> and <font face="monospace, monospace" size="1"><b>FileName</b></font> variables are not used for anything in this example, but they still illustrate the problem. I named the file <font face="monospace, monospace" size="1"><b>TEST.sh</b></font>, put it in my <font face="monospace, monospace" size="1"><b>~/bin</b></font> folder which is included in my <font face="monospace, monospace" size="1"><b>PATH</b></font> environment variable, so I will run this test with a random file as an argument.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Now, let's run this:</div><div><div><div><font face="monospace, monospace" size="1"><b>~$ TEST.sh .netrc</b></font></div><div><font face="monospace, monospace" size="1"><b><a href="http://web.comhem.se/something/" target="_blank">http://web.comhem.se/something/</a></b></font></div><div><font face="monospace, monospace" size="1"><b>~$ </b></font></div></div></div><div style="font-size:12.8px">Obviously, <b style="font-family:monospace,monospace;font-size:x-small">$(ToURI "${SelectedProject}" </b>didn't do anything, but why?</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">So, as I said, after hours of debugging, I came up with this:</div><div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace">#!/bin/bash</font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace"><br></font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace">FullPathName() {</font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace"><span style="white-space:pre-wrap">  </span># Declare local variables</font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace"><span style="white-space:pre-wrap">        </span>local Path="$1"</font></b></div><div style="font-size:12.8px"><span style="white-space:pre-wrap"><b><font size="1" face="monospace, monospace">        </font></b></span></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace"><span style="white-space:pre-wrap"> </span>if [[ ${Path:0:1} != / ]]; then<span style="white-space:pre-wrap"> </span># Relative path.</font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace"><span style="white-space:pre-wrap">         </span>echo "${PWD}/${Path}"</font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace"><span style="white-space:pre-wrap">  </span>else<span style="white-space:pre-wrap">                            </span># Absolute path.</font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace"><span style="white-space:pre-wrap">         </span>echo "${Path}"</font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace"><span style="white-space:pre-wrap"> </span>fi</font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace">}</font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace"><br></font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace">ToURI () {</font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace"><span style="white-space:pre-wrap">     </span># Declare local variables.</font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace"><span style="white-space:pre-wrap">       </span>export local FileName="$1"</font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace"><span style="white-space:pre-wrap">     </span>perl -MURI::file -e 'print URI::file->new($ENV{'FileName'})."\n"'</font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace">}</font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace"><br></font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace">File[1]=$(FullPathName "${1}")</font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace"># FileName[1]=$(basename "${File[1]}") ############## Disabled line ###############</font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace"><br></font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace">SelectedProject="Projekt Johnny Guitar"</font></b></div><div><font face="monospace, monospace" size="1"><b>RemoteRootFolder="<a href="http://web.comhem.se/something" target="_blank">http://web.comhem.se/something</a>"</b></font></div><div style="font-size:12.8px"><b style="font-size:12.8px"><font size="1" face="monospace, monospace">RemoteProjectFolder="${RemoteRootFolder}/"$(ToURI "${SelectedProject}")</font></b><br></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace"><br></font></b></div><div style="font-size:12.8px"><b><font size="1" face="monospace, monospace">echo "${RemoteProjectFolder}"</font></b></div></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">So, the only difference is that I disabled the line <b><font size="1" face="monospace, monospace">FileName[1]=$(basename "${File[1]}")</font></b>.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Now, let's try again:</div><div><div><font face="monospace, monospace" size="1"><b>~$ TEST.sh .netrc</b></font></div><div><font face="monospace, monospace" size="1"><b><a href="http://web.comhem.se/something/Projekt%20Johnny%20Guitar" target="_blank">http://web.comhem.se/something/Projekt%20Johnny%20Guitar</a></b></font></div><div><font face="monospace, monospace" size="1"><b>~$ </b></font></div></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">So, suddenly it works, but WHY?</div><div style="font-size:12.8px">I early suspected <font face="monospace, monospace" size="1"><b>basename</b></font>, but in the original script there are several <b style="font-family:monospace,monospace;font-size:x-small">basename</b> statements, but they don't mess anything up.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Seriously, what is going on here?</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><div><b><font size="1" face="monospace, monospace">~$ bash --version | grep release</font></b></div><div><b><font size="1" face="monospace, monospace">GNU bash, version 4.3.11(1)-release (i686-pc-linux-gnu)</font></b></div><div><b><font size="1" face="monospace, monospace">~$</font></b></div></div><b style="font-size:12.8px"><font size="1" face="monospace, monospace"><div><br></div><div><span style="font-family:arial,sans-serif;font-size:small;font-weight:normal"><br></span></div><div><b style="font-family:arial,sans-serif;font-size:12.8px"><font size="1" face="monospace, monospace"><div style="display:inline"><span style="font-family:arial,sans-serif;font-size:small;font-weight:normal">Any help is greatly appreciated, since this is a real showstopper for me at the moment.</span></div></font></b><br></div></font></b></div></div><span class="HOEnZb"><font color="#888888">
<br></font></span></div></div><span class="HOEnZb"><font color="#888888"><span>--<br>
ubuntu-users mailing list<br>
<a href="mailto:ubuntu-users@lists.ubuntu.com" target="_blank">ubuntu-users@lists.ubuntu.com</a><br>
Modify settings or unsubscribe at: <a href="https://lists.ubuntu.com/mailman/listinfo/ubuntu-users" rel="noreferrer" target="_blank">https://lists.ubuntu.com/mailman/listinfo/ubuntu-users</a><br>
<br></span></font></span></blockquote></div><span class="HOEnZb"><font color="#888888"><br></font></span></div><span class="HOEnZb"><font color="#888888">
<br>--<br>
ubuntu-users mailing list<br>
<a href="mailto:ubuntu-users@lists.ubuntu.com" target="_blank">ubuntu-users@lists.ubuntu.com</a><br>
Modify settings or unsubscribe at: <a href="https://lists.ubuntu.com/mailman/listinfo/ubuntu-users" rel="noreferrer" target="_blank">https://lists.ubuntu.com/mailman/listinfo/ubuntu-users</a><br>
<br></font></span></blockquote></div><br></div></div>
<br>--<br>
ubuntu-users mailing list<br>
<a href="mailto:ubuntu-users@lists.ubuntu.com">ubuntu-users@lists.ubuntu.com</a><br>
Modify settings or unsubscribe at: <a href="https://lists.ubuntu.com/mailman/listinfo/ubuntu-users" rel="noreferrer" target="_blank">https://lists.ubuntu.com/mailman/listinfo/ubuntu-users</a><br>
<br></blockquote></div><br></div></div>