Bob Lockie wrote: > >>if test "x$enable_ogglibs" = xyes; then > >>What does the "x" mean? > > > >The "x" is just there to make sure that there is something left of the > >test's operator in case the variable is empty. > > I can't find the "x" syntax in 'man test' or 'info test'. > Where is it explained?
I see your confusion. Let me try to explain it. Step back from the above and look at what happens in this case. var=yes test $var = yes && echo worked fine worked fine Everything is great, right? But what if 'var' contains something else. If the data was suspect because it came in from the result of an outside program then the value could be anything. Let me simulate that type of problem. var= test $var = yes && echo worked fine test: =: unary operator expected Huh? What happened? Use echo to see the result. echo test $var = yes test = yes That does not seem right. Oh now it is obvious. The $var is empty. Therefore it did not expand to anything. The 'test' operator is saw the '=' as the first arg and knew it was missing the first arg and prints an error message about the problem. Okay, we can fix that. Quote the variable. That way even if the variable is empty and expands to nothing then it is still an empty string argument. echo test "$var" = yes test = yes That extra space in this output shows that there was definitely an empty argument there. One with the 'test', pun intended. var= test "$var" = yes && echo worked fine Worked great. We are done, right? No not yet. What if a command spews this garbage into the string. var=-abcdefg echo test "$var" = yes test -abcdefg = yes What does 'test' do with that argument? In this case it can tell that it is a string and everything will parse. But test can get confused by that leading '-' and will think it is an option in some cases. Therefore to stop test from seeing the leading '-' a long standing rule has been to put another character before it. var=-abcdefg echo test "x$var" = xyes test x-abcdefg = xyes Now you can see that there is no way that 'test' can see that variable expansion as an option no matter what the contents of the variable might happen to be. Therefore you will see that shell programming idiom of prefixing all variable expansions with a non-option letter to guarentee that it cannot under any circumstances of bad input be tricked into generating a syntax error. Looking at it this way the test with the 'x' makes sense. if test "x$enable_ogglibs" = xyes; then But any non-option letter works just as well. Another common letter is the underscore. It has less pixels and looks more like whitespace and is less intrusive. But if that makes it easier to miss it might be easier to be a coding error as well. Different people like different things. I am only pointing it out for comparison. if test "_$enable_ogglibs" = _yes; then Hope that helps. Bob
