Bash shell script issue

Andrey Repin anrdaemon@yandex.ru
Wed Sep 7 17:35:00 GMT 2016


Greetings, Kipton Moravec!

> dalkmora@DALM0048 ~/walnut/dp2b_walnut_customer_flextronics/walnut
> $ od -cx testconvert1.sh 
> 0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n   e   c   h 
> 2123    622f    6e69    622f    7361    0d68    650a    6863 
> 0000020   o       $   P   W   D  \r  \n   p   r   o   j   e   c   t   _ 
> 206f    5024    4457    0a0d    7270    6a6f    6365    5f74 
> 0000040   r   o   o   t   =   $   P   W   D  \r  \n   e   c   h   o 
> 6f72    746f    243d    5750    0d44    650a    6863    206f 
> 0000060   $   p   r   o   j   e   c   t   _   r   o   o   t  \r  \n   x 
> 7024    6f72    656a    7463    725f    6f6f    0d74    780a 
> 0000100   =   $   {   p   r   o   j   e   c   t   _   r   o   o   t   } 
> 243d    707b    6f72    656a    7463    725f    6f6f    7d74 
> 0000120   /   t   o   o   l   s  \r  \n   e   c   h   o       $   x  \r 
> 742f    6f6f    736c    0a0d    6365    6f68    2420    0d78 
> 0000140  \n   e   c   h   o       $   {   x   }       |       c   a   t 
> 650a    6863    206f    7b24    7d78    7c20    6320    7461 
> 0000160       -   A 
> 2d20    0041 
> 0000163 

> Shows there is not "careless editing". 



> So "Insufficient quoting" means nothing to me. How should it be?

Put quotes around any variable expansion you are not in control of.

> I was taking the example from a shell script I found.


> So I added quoting on the echo:

> #!/bin/bash 
> echo "$PWD"

Good.

> project_root=$PWD

Still bad.

> echo "$project_root"

Good.

> x=${project_root}/tools 

Still bad.

> echo "$x" 
> echo "${x}" | cat -A

Good.

> dalkmora@DALM0048 ~/walnut/dp2b_walnut_customer_flextronics/walnut 
> $ ./testconvert1.sh 
> /home/dalkmora/walnut/dp2b_walnut_customer_flextronics/walnut 
> /home/dalkmora/walnut/dp2b_walnut_customer_flextronics/walnut 
> /toolsdalkmora/walnut/dp2b_walnut_customer_flextronics/walnut 
> /home/dalkmora/walnut/dp2b_walnut_customer_flextronics/walnut^M/tools^M$ 

> No difference. 

"^M" == \r == CR (Carriage Return)

Switch your N++ to "LF only" line endings.

> dalkmora@DALM0048 ~/walnut/dp2b_walnut_customer_flextronics/walnut
> $ d2u testconvert1.sh 
> dos2unix: converting file testconvert1.sh to Unix format... 

> dalkmora@DALM0048 ~/walnut/dp2b_walnut_customer_flextronics/walnut 
> $ ./testconvert1.sh 
> /home/dalkmora/walnut/dp2b_walnut_customer_flextronics/walnut 
> /home/dalkmora/walnut/dp2b_walnut_customer_flextronics/walnut 
> /home/dalkmora/walnut/dp2b_walnut_customer_flextronics/walnut/tools 
> /home/dalkmora/walnut/dp2b_walnut_customer_flextronics/walnut/tools$ 

> That fixed it, but I still do not understand it. 

> Why are there ^M (carriage return) in the middle of a line?

Because of the incorrect line endings.

When you assign "project_root=$PWD", you're, in fact, assigning
"project_root=$PWD\r"

Same for x and for the case where you quote part of the string.

project_root="$PWD"\r is treated the same as project_root="$PWD\r"

There's one way to force end of line before EOL, but I won't tell you to not
promote bad behavior.

What d2u did is removed these bogus CR characters and your script now works as
expected.

> I can understand the confusion at the end of the line. But there was none
> shown in the middle from od command.

It was inherited from previous assignment.

P.S.
Also, "insufficient quoting" issue is unrelated to incorrect line endings and
is meant to prevent ambiguous assignments like

x="Hello; echo rm -rf /"
y=$x


-- 
With best regards,
Andrey Repin
Wednesday, September 7, 2016 20:14:46

Sorry for my terrible english...


--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple



More information about the Cygwin mailing list