Running a Test with expression in a string

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP











up vote
2
down vote

favorite












I am trying to run the test command from a string. The string contains the expression.



 TEST="! -e ~/bin/xyz"
if [ `echo "$TEST"` ]; then
echo running "$TEST";
fi


However, the above if condition does evaluate to true but if I plug in the command directly (as below), it evaluates to false.



 if [ ! -e ~/bin/xyz ]; then
echo running;
fi


The second snippet's behavior is correct. Can someone help me understand why there is a difference and also how I can correct the first snippet to give me the right result?










share|improve this question









New contributor




Ashwin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.















  • 1




    I would not recommend storing test expressions in strings, as there isn't really a safe way to handle this. I'd recommend backing up and asking if there's a better way to do it. What's the actual problem you're trying to solve by storing test expressions in a string?
    – Gordon Davisson
    3 hours ago














up vote
2
down vote

favorite












I am trying to run the test command from a string. The string contains the expression.



 TEST="! -e ~/bin/xyz"
if [ `echo "$TEST"` ]; then
echo running "$TEST";
fi


However, the above if condition does evaluate to true but if I plug in the command directly (as below), it evaluates to false.



 if [ ! -e ~/bin/xyz ]; then
echo running;
fi


The second snippet's behavior is correct. Can someone help me understand why there is a difference and also how I can correct the first snippet to give me the right result?










share|improve this question









New contributor




Ashwin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.















  • 1




    I would not recommend storing test expressions in strings, as there isn't really a safe way to handle this. I'd recommend backing up and asking if there's a better way to do it. What's the actual problem you're trying to solve by storing test expressions in a string?
    – Gordon Davisson
    3 hours ago












up vote
2
down vote

favorite









up vote
2
down vote

favorite











I am trying to run the test command from a string. The string contains the expression.



 TEST="! -e ~/bin/xyz"
if [ `echo "$TEST"` ]; then
echo running "$TEST";
fi


However, the above if condition does evaluate to true but if I plug in the command directly (as below), it evaluates to false.



 if [ ! -e ~/bin/xyz ]; then
echo running;
fi


The second snippet's behavior is correct. Can someone help me understand why there is a difference and also how I can correct the first snippet to give me the right result?










share|improve this question









New contributor




Ashwin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











I am trying to run the test command from a string. The string contains the expression.



 TEST="! -e ~/bin/xyz"
if [ `echo "$TEST"` ]; then
echo running "$TEST";
fi


However, the above if condition does evaluate to true but if I plug in the command directly (as below), it evaluates to false.



 if [ ! -e ~/bin/xyz ]; then
echo running;
fi


The second snippet's behavior is correct. Can someone help me understand why there is a difference and also how I can correct the first snippet to give me the right result?







linux shell test






share|improve this question









New contributor




Ashwin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




Ashwin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited 4 hours ago









jimmij

29.9k867102




29.9k867102






New contributor




Ashwin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked 5 hours ago









Ashwin

212




212




New contributor




Ashwin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





Ashwin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






Ashwin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







  • 1




    I would not recommend storing test expressions in strings, as there isn't really a safe way to handle this. I'd recommend backing up and asking if there's a better way to do it. What's the actual problem you're trying to solve by storing test expressions in a string?
    – Gordon Davisson
    3 hours ago












  • 1




    I would not recommend storing test expressions in strings, as there isn't really a safe way to handle this. I'd recommend backing up and asking if there's a better way to do it. What's the actual problem you're trying to solve by storing test expressions in a string?
    – Gordon Davisson
    3 hours ago







1




1




I would not recommend storing test expressions in strings, as there isn't really a safe way to handle this. I'd recommend backing up and asking if there's a better way to do it. What's the actual problem you're trying to solve by storing test expressions in a string?
– Gordon Davisson
3 hours ago




I would not recommend storing test expressions in strings, as there isn't really a safe way to handle this. I'd recommend backing up and asking if there's a better way to do it. What's the actual problem you're trying to solve by storing test expressions in a string?
– Gordon Davisson
3 hours ago










1 Answer
1






active

oldest

votes

















up vote
2
down vote













The problem with first example is that you are testing whether the string that echo returns has non-zero length. One solution to this problem is to evaluate tested expression:



TEST="! -e ~/bin/xyz"
if eval "[ $TEST ]"; then
echo running "$TEST";
fi


Notice, that brackets are inside eval, because [ is a command, so we evaluate this command together with variable $TEST as its argument.






share|improve this answer


















  • 1




    Warning: as always, eval is an open invitation to weird bugs. It blurs the distinction between data and executable code (even more than it usually is in the shell), so you risk having something you thought was just data (e.g. a filename) get parsed & maybe executed as code. Basically, eval is only safe if you have full control over the string being evaluated (and if you have full control over it, you really shouldn't need eval).
    – Gordon Davisson
    3 hours ago










Your Answer








StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "106"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);






Ashwin is a new contributor. Be nice, and check out our Code of Conduct.









 

draft saved


draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f479693%2frunning-a-test-with-expression-in-a-string%23new-answer', 'question_page');

);

Post as a guest






























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes








up vote
2
down vote













The problem with first example is that you are testing whether the string that echo returns has non-zero length. One solution to this problem is to evaluate tested expression:



TEST="! -e ~/bin/xyz"
if eval "[ $TEST ]"; then
echo running "$TEST";
fi


Notice, that brackets are inside eval, because [ is a command, so we evaluate this command together with variable $TEST as its argument.






share|improve this answer


















  • 1




    Warning: as always, eval is an open invitation to weird bugs. It blurs the distinction between data and executable code (even more than it usually is in the shell), so you risk having something you thought was just data (e.g. a filename) get parsed & maybe executed as code. Basically, eval is only safe if you have full control over the string being evaluated (and if you have full control over it, you really shouldn't need eval).
    – Gordon Davisson
    3 hours ago














up vote
2
down vote













The problem with first example is that you are testing whether the string that echo returns has non-zero length. One solution to this problem is to evaluate tested expression:



TEST="! -e ~/bin/xyz"
if eval "[ $TEST ]"; then
echo running "$TEST";
fi


Notice, that brackets are inside eval, because [ is a command, so we evaluate this command together with variable $TEST as its argument.






share|improve this answer


















  • 1




    Warning: as always, eval is an open invitation to weird bugs. It blurs the distinction between data and executable code (even more than it usually is in the shell), so you risk having something you thought was just data (e.g. a filename) get parsed & maybe executed as code. Basically, eval is only safe if you have full control over the string being evaluated (and if you have full control over it, you really shouldn't need eval).
    – Gordon Davisson
    3 hours ago












up vote
2
down vote










up vote
2
down vote









The problem with first example is that you are testing whether the string that echo returns has non-zero length. One solution to this problem is to evaluate tested expression:



TEST="! -e ~/bin/xyz"
if eval "[ $TEST ]"; then
echo running "$TEST";
fi


Notice, that brackets are inside eval, because [ is a command, so we evaluate this command together with variable $TEST as its argument.






share|improve this answer














The problem with first example is that you are testing whether the string that echo returns has non-zero length. One solution to this problem is to evaluate tested expression:



TEST="! -e ~/bin/xyz"
if eval "[ $TEST ]"; then
echo running "$TEST";
fi


Notice, that brackets are inside eval, because [ is a command, so we evaluate this command together with variable $TEST as its argument.







share|improve this answer














share|improve this answer



share|improve this answer








edited 3 hours ago









Kusalananda

113k15216344




113k15216344










answered 4 hours ago









jimmij

29.9k867102




29.9k867102







  • 1




    Warning: as always, eval is an open invitation to weird bugs. It blurs the distinction between data and executable code (even more than it usually is in the shell), so you risk having something you thought was just data (e.g. a filename) get parsed & maybe executed as code. Basically, eval is only safe if you have full control over the string being evaluated (and if you have full control over it, you really shouldn't need eval).
    – Gordon Davisson
    3 hours ago












  • 1




    Warning: as always, eval is an open invitation to weird bugs. It blurs the distinction between data and executable code (even more than it usually is in the shell), so you risk having something you thought was just data (e.g. a filename) get parsed & maybe executed as code. Basically, eval is only safe if you have full control over the string being evaluated (and if you have full control over it, you really shouldn't need eval).
    – Gordon Davisson
    3 hours ago







1




1




Warning: as always, eval is an open invitation to weird bugs. It blurs the distinction between data and executable code (even more than it usually is in the shell), so you risk having something you thought was just data (e.g. a filename) get parsed & maybe executed as code. Basically, eval is only safe if you have full control over the string being evaluated (and if you have full control over it, you really shouldn't need eval).
– Gordon Davisson
3 hours ago




Warning: as always, eval is an open invitation to weird bugs. It blurs the distinction between data and executable code (even more than it usually is in the shell), so you risk having something you thought was just data (e.g. a filename) get parsed & maybe executed as code. Basically, eval is only safe if you have full control over the string being evaluated (and if you have full control over it, you really shouldn't need eval).
– Gordon Davisson
3 hours ago










Ashwin is a new contributor. Be nice, and check out our Code of Conduct.









 

draft saved


draft discarded


















Ashwin is a new contributor. Be nice, and check out our Code of Conduct.












Ashwin is a new contributor. Be nice, and check out our Code of Conduct.











Ashwin is a new contributor. Be nice, and check out our Code of Conduct.













 


draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f479693%2frunning-a-test-with-expression-in-a-string%23new-answer', 'question_page');

);

Post as a guest













































































Comments

Popular posts from this blog

What does second last employer means? [closed]

List of Gilmore Girls characters

Confectionery