Dynamic substitution of variables in bash The 2019 Stack Overflow Developer Survey Results Are InHow to insert bash variables in awk?Joining bash arguments into single string with spacesDouble variable substitution in bashHow to generate dynamic menu and make it usable?Can't pipe from echo to bash built-in read?How can I evaluate bash arguments in a string once variables have changedHow can I change a Bash variable name in a loop and then expand the changed name?Creating n variables in Bash without assigning them one by one?bash share array in “for do () & wait” loopHow can I export a variable in bash where the variable name is comprised of two variables?
How much of the clove should I use when using big garlic heads?
Are spiders unable to hurt humans, especially very small spiders?
Is it possible for absolutely everyone to attain enlightenment?
What is preventing me from simply constructing a hash that's lower than the current target?
How can I define good in a religion that claims no moral authority?
Pokemon Turn Based battle (Python)
Geography at the pixel level
Getting crown tickets for Statue of Liberty
Is it ethical to upload a automatically generated paper to a non peer-reviewed site as part of a larger research?
Is it okay to consider publishing in my first year of PhD?
Why doesn't shell automatically fix "useless use of cat"?
Why doesn't UInt have a toDouble()?
Old scifi movie from the 50s or 60s with men in solid red uniforms who interrogate a spy from the past
Why was M87 targeted for the Event Horizon Telescope instead of Sagittarius A*?
Why “相同意思的词” is called “同义词” instead of "同意词"?
How do you keep chess fun when your opponent constantly beats you?
Is Cinnamon a desktop environment or a window manager? (Or both?)
How can I add encounters in the Lost Mine of Phandelver campaign without giving PCs too much XP?
I am an eight letter word. What am I?
What is the meaning of Triage in Cybersec world?
What is this sharp, curved notch on my knife for?
Keeping a retro style to sci-fi spaceships?
What is this business jet?
Did any laptop computers have a built-in 5 1/4 inch floppy drive?
Dynamic substitution of variables in bash
The 2019 Stack Overflow Developer Survey Results Are InHow to insert bash variables in awk?Joining bash arguments into single string with spacesDouble variable substitution in bashHow to generate dynamic menu and make it usable?Can't pipe from echo to bash built-in read?How can I evaluate bash arguments in a string once variables have changedHow can I change a Bash variable name in a loop and then expand the changed name?Creating n variables in Bash without assigning them one by one?bash share array in “for do () & wait” loopHow can I export a variable in bash where the variable name is comprised of two variables?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
Honestly I don't even know how to ask this, or what are the proper terms lol
So what I'm trying to do, is to work on variables with variable names. I think I'd best describe it by actually showing it:
So what I had before was this
if [ -z $file_var ]; then
echo "empty argument"
fi
if [ -z $pw_var ]; then
echo "empty argument"
fi
So what I was trying to do was not have two if statements, but have just one and a for loop, something like this:
for i in file_var, pw_var;do
if [ -z $$i ]; then
echo "empty argument"
fi
done
Now this obviously doesn't work, so I'm wondering how is it properly done.
bash
add a comment |
Honestly I don't even know how to ask this, or what are the proper terms lol
So what I'm trying to do, is to work on variables with variable names. I think I'd best describe it by actually showing it:
So what I had before was this
if [ -z $file_var ]; then
echo "empty argument"
fi
if [ -z $pw_var ]; then
echo "empty argument"
fi
So what I was trying to do was not have two if statements, but have just one and a for loop, something like this:
for i in file_var, pw_var;do
if [ -z $$i ]; then
echo "empty argument"
fi
done
Now this obviously doesn't work, so I'm wondering how is it properly done.
bash
add a comment |
Honestly I don't even know how to ask this, or what are the proper terms lol
So what I'm trying to do, is to work on variables with variable names. I think I'd best describe it by actually showing it:
So what I had before was this
if [ -z $file_var ]; then
echo "empty argument"
fi
if [ -z $pw_var ]; then
echo "empty argument"
fi
So what I was trying to do was not have two if statements, but have just one and a for loop, something like this:
for i in file_var, pw_var;do
if [ -z $$i ]; then
echo "empty argument"
fi
done
Now this obviously doesn't work, so I'm wondering how is it properly done.
bash
Honestly I don't even know how to ask this, or what are the proper terms lol
So what I'm trying to do, is to work on variables with variable names. I think I'd best describe it by actually showing it:
So what I had before was this
if [ -z $file_var ]; then
echo "empty argument"
fi
if [ -z $pw_var ]; then
echo "empty argument"
fi
So what I was trying to do was not have two if statements, but have just one and a for loop, something like this:
for i in file_var, pw_var;do
if [ -z $$i ]; then
echo "empty argument"
fi
done
Now this obviously doesn't work, so I'm wondering how is it properly done.
bash
bash
asked 4 hours ago
user323587user323587
542
542
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
What you're trying to do is indirect expansion, which Bash supports using !
:
if [ -z "$!i" ] ; then
If the first character of parameter is an exclamation point (
!
), and parameter is not a nameref, it introduces a level of indirection. Bash uses the value formed by expanding the rest of parameter as the new parameter; this is then expanded and that value is used in the rest of the expansion, rather than the expansion of the original parameter. This is known as indirect expansion.
In this case, "$!i"
expands to whatever the value of the variable whose name is stored in i
, and -z
will test that indirectly-accessed value.
Alternatively, a nameref is a special type of variable that has this behaviour automatically. You make a nameref variable using declare -n name
, and thereafter
All references, assignments, and attribute modifications to
name
, except for those using or changing the-n
attribute itself, are performed on the variable referenced byname
’s value.
So if you add
declare -n i
before your loop, it will mean that just
for i in file_var pw_var
do
if [ -z "$i" ]
then
...
fi
done
will work as you wanted. Do note though that assignments to i
(as opposed to its being set in a loop like this) will modify the target variable.
Note also that there is no comma between items you're looping over in a Bash for
loop like how you've written it in the question.
Thank you! That's exactly what I needed! Also thanks for the for loop tip :D
– user323587
4 hours ago
add a comment |
This code works, if file_var or pw_var are empty it will print that the specific variable is empty. You can tweak it to fit your usage.
file_var=""
pw_var=""
for i in 'file_var' 'pw_var';do
if [ -z $!i ]; then
echo "$i is empty"
fi
done
New contributor
add a comment |
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',
autoActivateHeartbeat: false,
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f512008%2fdynamic-substitution-of-variables-in-bash%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
What you're trying to do is indirect expansion, which Bash supports using !
:
if [ -z "$!i" ] ; then
If the first character of parameter is an exclamation point (
!
), and parameter is not a nameref, it introduces a level of indirection. Bash uses the value formed by expanding the rest of parameter as the new parameter; this is then expanded and that value is used in the rest of the expansion, rather than the expansion of the original parameter. This is known as indirect expansion.
In this case, "$!i"
expands to whatever the value of the variable whose name is stored in i
, and -z
will test that indirectly-accessed value.
Alternatively, a nameref is a special type of variable that has this behaviour automatically. You make a nameref variable using declare -n name
, and thereafter
All references, assignments, and attribute modifications to
name
, except for those using or changing the-n
attribute itself, are performed on the variable referenced byname
’s value.
So if you add
declare -n i
before your loop, it will mean that just
for i in file_var pw_var
do
if [ -z "$i" ]
then
...
fi
done
will work as you wanted. Do note though that assignments to i
(as opposed to its being set in a loop like this) will modify the target variable.
Note also that there is no comma between items you're looping over in a Bash for
loop like how you've written it in the question.
Thank you! That's exactly what I needed! Also thanks for the for loop tip :D
– user323587
4 hours ago
add a comment |
What you're trying to do is indirect expansion, which Bash supports using !
:
if [ -z "$!i" ] ; then
If the first character of parameter is an exclamation point (
!
), and parameter is not a nameref, it introduces a level of indirection. Bash uses the value formed by expanding the rest of parameter as the new parameter; this is then expanded and that value is used in the rest of the expansion, rather than the expansion of the original parameter. This is known as indirect expansion.
In this case, "$!i"
expands to whatever the value of the variable whose name is stored in i
, and -z
will test that indirectly-accessed value.
Alternatively, a nameref is a special type of variable that has this behaviour automatically. You make a nameref variable using declare -n name
, and thereafter
All references, assignments, and attribute modifications to
name
, except for those using or changing the-n
attribute itself, are performed on the variable referenced byname
’s value.
So if you add
declare -n i
before your loop, it will mean that just
for i in file_var pw_var
do
if [ -z "$i" ]
then
...
fi
done
will work as you wanted. Do note though that assignments to i
(as opposed to its being set in a loop like this) will modify the target variable.
Note also that there is no comma between items you're looping over in a Bash for
loop like how you've written it in the question.
Thank you! That's exactly what I needed! Also thanks for the for loop tip :D
– user323587
4 hours ago
add a comment |
What you're trying to do is indirect expansion, which Bash supports using !
:
if [ -z "$!i" ] ; then
If the first character of parameter is an exclamation point (
!
), and parameter is not a nameref, it introduces a level of indirection. Bash uses the value formed by expanding the rest of parameter as the new parameter; this is then expanded and that value is used in the rest of the expansion, rather than the expansion of the original parameter. This is known as indirect expansion.
In this case, "$!i"
expands to whatever the value of the variable whose name is stored in i
, and -z
will test that indirectly-accessed value.
Alternatively, a nameref is a special type of variable that has this behaviour automatically. You make a nameref variable using declare -n name
, and thereafter
All references, assignments, and attribute modifications to
name
, except for those using or changing the-n
attribute itself, are performed on the variable referenced byname
’s value.
So if you add
declare -n i
before your loop, it will mean that just
for i in file_var pw_var
do
if [ -z "$i" ]
then
...
fi
done
will work as you wanted. Do note though that assignments to i
(as opposed to its being set in a loop like this) will modify the target variable.
Note also that there is no comma between items you're looping over in a Bash for
loop like how you've written it in the question.
What you're trying to do is indirect expansion, which Bash supports using !
:
if [ -z "$!i" ] ; then
If the first character of parameter is an exclamation point (
!
), and parameter is not a nameref, it introduces a level of indirection. Bash uses the value formed by expanding the rest of parameter as the new parameter; this is then expanded and that value is used in the rest of the expansion, rather than the expansion of the original parameter. This is known as indirect expansion.
In this case, "$!i"
expands to whatever the value of the variable whose name is stored in i
, and -z
will test that indirectly-accessed value.
Alternatively, a nameref is a special type of variable that has this behaviour automatically. You make a nameref variable using declare -n name
, and thereafter
All references, assignments, and attribute modifications to
name
, except for those using or changing the-n
attribute itself, are performed on the variable referenced byname
’s value.
So if you add
declare -n i
before your loop, it will mean that just
for i in file_var pw_var
do
if [ -z "$i" ]
then
...
fi
done
will work as you wanted. Do note though that assignments to i
(as opposed to its being set in a loop like this) will modify the target variable.
Note also that there is no comma between items you're looping over in a Bash for
loop like how you've written it in the question.
edited 4 hours ago
answered 4 hours ago
Michael HomerMichael Homer
50.8k8141177
50.8k8141177
Thank you! That's exactly what I needed! Also thanks for the for loop tip :D
– user323587
4 hours ago
add a comment |
Thank you! That's exactly what I needed! Also thanks for the for loop tip :D
– user323587
4 hours ago
Thank you! That's exactly what I needed! Also thanks for the for loop tip :D
– user323587
4 hours ago
Thank you! That's exactly what I needed! Also thanks for the for loop tip :D
– user323587
4 hours ago
add a comment |
This code works, if file_var or pw_var are empty it will print that the specific variable is empty. You can tweak it to fit your usage.
file_var=""
pw_var=""
for i in 'file_var' 'pw_var';do
if [ -z $!i ]; then
echo "$i is empty"
fi
done
New contributor
add a comment |
This code works, if file_var or pw_var are empty it will print that the specific variable is empty. You can tweak it to fit your usage.
file_var=""
pw_var=""
for i in 'file_var' 'pw_var';do
if [ -z $!i ]; then
echo "$i is empty"
fi
done
New contributor
add a comment |
This code works, if file_var or pw_var are empty it will print that the specific variable is empty. You can tweak it to fit your usage.
file_var=""
pw_var=""
for i in 'file_var' 'pw_var';do
if [ -z $!i ]; then
echo "$i is empty"
fi
done
New contributor
This code works, if file_var or pw_var are empty it will print that the specific variable is empty. You can tweak it to fit your usage.
file_var=""
pw_var=""
for i in 'file_var' 'pw_var';do
if [ -z $!i ]; then
echo "$i is empty"
fi
done
New contributor
New contributor
answered 4 hours ago
Bob DoleBob Dole
661
661
New contributor
New contributor
add a comment |
add a comment |
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f512008%2fdynamic-substitution-of-variables-in-bash%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown