How to iterate through a set of variables, then expand the variables in Bash
I'm trying to set up a "check if machines are online" script with Bash, but running into an issue of when and where to define the variables so they're expanded properly. Something like:
#!/bin/bash
rm01="c01 c02 c03"
rm02="d01 d02 d03"
rm10="e11 e22 e33"
for room in rm01 rm02 rm03; do
echo $room
for computer in $room; do
#run various nslookup/ping tests and report
done
done
exit 0
I'm running into issues because I can't find a way to expand $room
for its corresponding set of computers (in $rm01
, $rm02
, $rm10
) listed at the beginning.
What am I doing wrong?
bash variables iteration
add a comment |
I'm trying to set up a "check if machines are online" script with Bash, but running into an issue of when and where to define the variables so they're expanded properly. Something like:
#!/bin/bash
rm01="c01 c02 c03"
rm02="d01 d02 d03"
rm10="e11 e22 e33"
for room in rm01 rm02 rm03; do
echo $room
for computer in $room; do
#run various nslookup/ping tests and report
done
done
exit 0
I'm running into issues because I can't find a way to expand $room
for its corresponding set of computers (in $rm01
, $rm02
, $rm10
) listed at the beginning.
What am I doing wrong?
bash variables iteration
add a comment |
I'm trying to set up a "check if machines are online" script with Bash, but running into an issue of when and where to define the variables so they're expanded properly. Something like:
#!/bin/bash
rm01="c01 c02 c03"
rm02="d01 d02 d03"
rm10="e11 e22 e33"
for room in rm01 rm02 rm03; do
echo $room
for computer in $room; do
#run various nslookup/ping tests and report
done
done
exit 0
I'm running into issues because I can't find a way to expand $room
for its corresponding set of computers (in $rm01
, $rm02
, $rm10
) listed at the beginning.
What am I doing wrong?
bash variables iteration
I'm trying to set up a "check if machines are online" script with Bash, but running into an issue of when and where to define the variables so they're expanded properly. Something like:
#!/bin/bash
rm01="c01 c02 c03"
rm02="d01 d02 d03"
rm10="e11 e22 e33"
for room in rm01 rm02 rm03; do
echo $room
for computer in $room; do
#run various nslookup/ping tests and report
done
done
exit 0
I'm running into issues because I can't find a way to expand $room
for its corresponding set of computers (in $rm01
, $rm02
, $rm10
) listed at the beginning.
What am I doing wrong?
bash variables iteration
bash variables iteration
edited Nov 21 '18 at 15:50
Benjamin W.
21.5k135257
21.5k135257
asked Nov 21 '18 at 15:37
phonedog365phonedog365
334
334
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
The quick fix is to use variable indirection:
for computer in ${!room}; do
Relying on word splitting is rarely the best idea, though. You could use arrays and namerefs instead (requires Bash 4.3 or newer):
#!/usr/bin/env bash
# Declare arrays
rm01=(c01 c02 c03)
rm02=(d01 d02 d03)
rm03=(e11 e22 e33)
# Declare room as nameref
declare -n room
# Using nameref as control variable sets room as reference to each variable in turn
for room in rm{01..03}; do
# Properly quoted array expansion
for computer in "${room[@]}"; do
echo "$computer" # or whatever needs to be done
done
done
exit 0
Is there a way to do the arrays/nameref method with older bash? I'm stuck on 3.4 because Apple updates its BSD binaries infrequently. The first example is working just fine, thanks.
– phonedog365
Nov 22 '18 at 19:19
@phonedog365 You could install a more recent Bash with Homebrew; I think you're actually on Bash 3.2 with macOS. If you can't use namerefs, you can use indirection as in this Q&A. Another good read is BashFAQ/006.
– Benjamin W.
Nov 22 '18 at 19:31
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
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: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
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%2fstackoverflow.com%2fquestions%2f53415559%2fhow-to-iterate-through-a-set-of-variables-then-expand-the-variables-in-bash%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
The quick fix is to use variable indirection:
for computer in ${!room}; do
Relying on word splitting is rarely the best idea, though. You could use arrays and namerefs instead (requires Bash 4.3 or newer):
#!/usr/bin/env bash
# Declare arrays
rm01=(c01 c02 c03)
rm02=(d01 d02 d03)
rm03=(e11 e22 e33)
# Declare room as nameref
declare -n room
# Using nameref as control variable sets room as reference to each variable in turn
for room in rm{01..03}; do
# Properly quoted array expansion
for computer in "${room[@]}"; do
echo "$computer" # or whatever needs to be done
done
done
exit 0
Is there a way to do the arrays/nameref method with older bash? I'm stuck on 3.4 because Apple updates its BSD binaries infrequently. The first example is working just fine, thanks.
– phonedog365
Nov 22 '18 at 19:19
@phonedog365 You could install a more recent Bash with Homebrew; I think you're actually on Bash 3.2 with macOS. If you can't use namerefs, you can use indirection as in this Q&A. Another good read is BashFAQ/006.
– Benjamin W.
Nov 22 '18 at 19:31
add a comment |
The quick fix is to use variable indirection:
for computer in ${!room}; do
Relying on word splitting is rarely the best idea, though. You could use arrays and namerefs instead (requires Bash 4.3 or newer):
#!/usr/bin/env bash
# Declare arrays
rm01=(c01 c02 c03)
rm02=(d01 d02 d03)
rm03=(e11 e22 e33)
# Declare room as nameref
declare -n room
# Using nameref as control variable sets room as reference to each variable in turn
for room in rm{01..03}; do
# Properly quoted array expansion
for computer in "${room[@]}"; do
echo "$computer" # or whatever needs to be done
done
done
exit 0
Is there a way to do the arrays/nameref method with older bash? I'm stuck on 3.4 because Apple updates its BSD binaries infrequently. The first example is working just fine, thanks.
– phonedog365
Nov 22 '18 at 19:19
@phonedog365 You could install a more recent Bash with Homebrew; I think you're actually on Bash 3.2 with macOS. If you can't use namerefs, you can use indirection as in this Q&A. Another good read is BashFAQ/006.
– Benjamin W.
Nov 22 '18 at 19:31
add a comment |
The quick fix is to use variable indirection:
for computer in ${!room}; do
Relying on word splitting is rarely the best idea, though. You could use arrays and namerefs instead (requires Bash 4.3 or newer):
#!/usr/bin/env bash
# Declare arrays
rm01=(c01 c02 c03)
rm02=(d01 d02 d03)
rm03=(e11 e22 e33)
# Declare room as nameref
declare -n room
# Using nameref as control variable sets room as reference to each variable in turn
for room in rm{01..03}; do
# Properly quoted array expansion
for computer in "${room[@]}"; do
echo "$computer" # or whatever needs to be done
done
done
exit 0
The quick fix is to use variable indirection:
for computer in ${!room}; do
Relying on word splitting is rarely the best idea, though. You could use arrays and namerefs instead (requires Bash 4.3 or newer):
#!/usr/bin/env bash
# Declare arrays
rm01=(c01 c02 c03)
rm02=(d01 d02 d03)
rm03=(e11 e22 e33)
# Declare room as nameref
declare -n room
# Using nameref as control variable sets room as reference to each variable in turn
for room in rm{01..03}; do
# Properly quoted array expansion
for computer in "${room[@]}"; do
echo "$computer" # or whatever needs to be done
done
done
exit 0
edited Nov 21 '18 at 15:59
answered Nov 21 '18 at 15:49
Benjamin W.Benjamin W.
21.5k135257
21.5k135257
Is there a way to do the arrays/nameref method with older bash? I'm stuck on 3.4 because Apple updates its BSD binaries infrequently. The first example is working just fine, thanks.
– phonedog365
Nov 22 '18 at 19:19
@phonedog365 You could install a more recent Bash with Homebrew; I think you're actually on Bash 3.2 with macOS. If you can't use namerefs, you can use indirection as in this Q&A. Another good read is BashFAQ/006.
– Benjamin W.
Nov 22 '18 at 19:31
add a comment |
Is there a way to do the arrays/nameref method with older bash? I'm stuck on 3.4 because Apple updates its BSD binaries infrequently. The first example is working just fine, thanks.
– phonedog365
Nov 22 '18 at 19:19
@phonedog365 You could install a more recent Bash with Homebrew; I think you're actually on Bash 3.2 with macOS. If you can't use namerefs, you can use indirection as in this Q&A. Another good read is BashFAQ/006.
– Benjamin W.
Nov 22 '18 at 19:31
Is there a way to do the arrays/nameref method with older bash? I'm stuck on 3.4 because Apple updates its BSD binaries infrequently. The first example is working just fine, thanks.
– phonedog365
Nov 22 '18 at 19:19
Is there a way to do the arrays/nameref method with older bash? I'm stuck on 3.4 because Apple updates its BSD binaries infrequently. The first example is working just fine, thanks.
– phonedog365
Nov 22 '18 at 19:19
@phonedog365 You could install a more recent Bash with Homebrew; I think you're actually on Bash 3.2 with macOS. If you can't use namerefs, you can use indirection as in this Q&A. Another good read is BashFAQ/006.
– Benjamin W.
Nov 22 '18 at 19:31
@phonedog365 You could install a more recent Bash with Homebrew; I think you're actually on Bash 3.2 with macOS. If you can't use namerefs, you can use indirection as in this Q&A. Another good read is BashFAQ/006.
– Benjamin W.
Nov 22 '18 at 19:31
add a comment |
Thanks for contributing an answer to Stack Overflow!
- 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%2fstackoverflow.com%2fquestions%2f53415559%2fhow-to-iterate-through-a-set-of-variables-then-expand-the-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