How to treat a command output as text
up vote
5
down vote
favorite
I need to compare a command output with a string.
This is the scenario:
pvs_var=$(pvs | grep "sdb1")
so pvs var is: /dev/sdb1 vg_name lvm2 a-- 100.00g 0
if [[ $($pvs_var | awk '{ print $2 }') = vg_name ]]; then
do something
fi
The issue is that the output of the if statement is
-bash: /dev/sdb1: Permission denied
I don't understand this behavior.
Thank you
bash command string output
add a comment |
up vote
5
down vote
favorite
I need to compare a command output with a string.
This is the scenario:
pvs_var=$(pvs | grep "sdb1")
so pvs var is: /dev/sdb1 vg_name lvm2 a-- 100.00g 0
if [[ $($pvs_var | awk '{ print $2 }') = vg_name ]]; then
do something
fi
The issue is that the output of the if statement is
-bash: /dev/sdb1: Permission denied
I don't understand this behavior.
Thank you
bash command string output
add a comment |
up vote
5
down vote
favorite
up vote
5
down vote
favorite
I need to compare a command output with a string.
This is the scenario:
pvs_var=$(pvs | grep "sdb1")
so pvs var is: /dev/sdb1 vg_name lvm2 a-- 100.00g 0
if [[ $($pvs_var | awk '{ print $2 }') = vg_name ]]; then
do something
fi
The issue is that the output of the if statement is
-bash: /dev/sdb1: Permission denied
I don't understand this behavior.
Thank you
bash command string output
I need to compare a command output with a string.
This is the scenario:
pvs_var=$(pvs | grep "sdb1")
so pvs var is: /dev/sdb1 vg_name lvm2 a-- 100.00g 0
if [[ $($pvs_var | awk '{ print $2 }') = vg_name ]]; then
do something
fi
The issue is that the output of the if statement is
-bash: /dev/sdb1: Permission denied
I don't understand this behavior.
Thank you
bash command string output
bash command string output
asked Nov 30 at 15:42
intore
10619
10619
add a comment |
add a comment |
4 Answers
4
active
oldest
votes
up vote
12
down vote
accepted
You are attempting to execute the contents of $pvs_var
as a command, rather than passing the string to awk.
To fix this, add an echo
or printf
in your if statement:
if [[ $(echo "$pvs_var" | awk '{ print $2 }') = vg_name ]]; then
do something
fi
Since the shell is bash, might as wellawk '{ print $2 }' <<<"$pvs_var"
– D. Ben Knoble
Nov 30 at 23:13
@D.BenKnoble: Even better, we can replace the double brackets with single brackets and then it’s POSIX compliant.
– Peschke
Nov 30 at 23:22
@Peschke With single brackets, you'd want to add double-quotes around the$( )
expression.
– Gordon Davisson
Dec 1 at 3:49
You definitely wantprintf
in the general case. Echo can do strange things if the variable contains backslashes or starts with a dash.
– Kevin
Dec 1 at 17:08
add a comment |
up vote
4
down vote
Get the output in JSON format, and then you'll be able to extract information in a more reliable way:
pv_info=$(pvs -o pv_all,vg_all --unit b --nosuffix --reportformat json)
sdb1_vg=$(
printf '%sn' "$pv_info" |
jq -r '.report.pv|select(.pv_name == "/dev/sdb1").vg_name'
)
if [ "$sdb1_vg" = vg_name ]; then...
Or use a proper programming language with a JSON library instead of a shell (ksh93
does have JSON support though in its upcoming version).
If it's just that one query you want to do, pvs
can also do all the work for you:
sdb1_vg=$(
pvs -o vg_name -S pv_name=/dev/sdb1 --no-heading --config 'log{prefix=""}'
)
Also remember to quote your variables and avoid echo
.
add a comment |
up vote
2
down vote
If you want to compare the VG from the output, then it might be easier to pre-process that:
# if you still need it
pvs_var=$(pvs | grep "sdb1")
vg_name=$(pvs | grep "sdb1" | awk '{print $2}')
if [ "$vg_name" = "vg_name" ]; then
echo do something
fi
What you were doing with
$($pvs_var | awk '{ print $2 }')
was initiating a command substitution $( ... )
whose first command was $pvs_var
. Bash dutifully substituted the value of the variable and then attempted to execute it. That's not what you wanted.
Another alternative would be to send the variable as a here-string to the awk command:
# ...
if [ $(awk '{print $2}' <<< "$pvs_var") = "vg_name" ]; then
# ...
Here, the command substitution is calling awk and passing it input on stdin -- the contents of the $pvs_var
variable.
add a comment |
up vote
0
down vote
You can try only with awk :
pvs | awk -v search='vg_name' '/sdb1/&&$2==search{exit 1}' || echo "ok"
add a comment |
4 Answers
4
active
oldest
votes
4 Answers
4
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
12
down vote
accepted
You are attempting to execute the contents of $pvs_var
as a command, rather than passing the string to awk.
To fix this, add an echo
or printf
in your if statement:
if [[ $(echo "$pvs_var" | awk '{ print $2 }') = vg_name ]]; then
do something
fi
Since the shell is bash, might as wellawk '{ print $2 }' <<<"$pvs_var"
– D. Ben Knoble
Nov 30 at 23:13
@D.BenKnoble: Even better, we can replace the double brackets with single brackets and then it’s POSIX compliant.
– Peschke
Nov 30 at 23:22
@Peschke With single brackets, you'd want to add double-quotes around the$( )
expression.
– Gordon Davisson
Dec 1 at 3:49
You definitely wantprintf
in the general case. Echo can do strange things if the variable contains backslashes or starts with a dash.
– Kevin
Dec 1 at 17:08
add a comment |
up vote
12
down vote
accepted
You are attempting to execute the contents of $pvs_var
as a command, rather than passing the string to awk.
To fix this, add an echo
or printf
in your if statement:
if [[ $(echo "$pvs_var" | awk '{ print $2 }') = vg_name ]]; then
do something
fi
Since the shell is bash, might as wellawk '{ print $2 }' <<<"$pvs_var"
– D. Ben Knoble
Nov 30 at 23:13
@D.BenKnoble: Even better, we can replace the double brackets with single brackets and then it’s POSIX compliant.
– Peschke
Nov 30 at 23:22
@Peschke With single brackets, you'd want to add double-quotes around the$( )
expression.
– Gordon Davisson
Dec 1 at 3:49
You definitely wantprintf
in the general case. Echo can do strange things if the variable contains backslashes or starts with a dash.
– Kevin
Dec 1 at 17:08
add a comment |
up vote
12
down vote
accepted
up vote
12
down vote
accepted
You are attempting to execute the contents of $pvs_var
as a command, rather than passing the string to awk.
To fix this, add an echo
or printf
in your if statement:
if [[ $(echo "$pvs_var" | awk '{ print $2 }') = vg_name ]]; then
do something
fi
You are attempting to execute the contents of $pvs_var
as a command, rather than passing the string to awk.
To fix this, add an echo
or printf
in your if statement:
if [[ $(echo "$pvs_var" | awk '{ print $2 }') = vg_name ]]; then
do something
fi
edited Dec 1 at 0:50
answered Nov 30 at 15:58
Peschke
2,400924
2,400924
Since the shell is bash, might as wellawk '{ print $2 }' <<<"$pvs_var"
– D. Ben Knoble
Nov 30 at 23:13
@D.BenKnoble: Even better, we can replace the double brackets with single brackets and then it’s POSIX compliant.
– Peschke
Nov 30 at 23:22
@Peschke With single brackets, you'd want to add double-quotes around the$( )
expression.
– Gordon Davisson
Dec 1 at 3:49
You definitely wantprintf
in the general case. Echo can do strange things if the variable contains backslashes or starts with a dash.
– Kevin
Dec 1 at 17:08
add a comment |
Since the shell is bash, might as wellawk '{ print $2 }' <<<"$pvs_var"
– D. Ben Knoble
Nov 30 at 23:13
@D.BenKnoble: Even better, we can replace the double brackets with single brackets and then it’s POSIX compliant.
– Peschke
Nov 30 at 23:22
@Peschke With single brackets, you'd want to add double-quotes around the$( )
expression.
– Gordon Davisson
Dec 1 at 3:49
You definitely wantprintf
in the general case. Echo can do strange things if the variable contains backslashes or starts with a dash.
– Kevin
Dec 1 at 17:08
Since the shell is bash, might as well
awk '{ print $2 }' <<<"$pvs_var"
– D. Ben Knoble
Nov 30 at 23:13
Since the shell is bash, might as well
awk '{ print $2 }' <<<"$pvs_var"
– D. Ben Knoble
Nov 30 at 23:13
@D.BenKnoble: Even better, we can replace the double brackets with single brackets and then it’s POSIX compliant.
– Peschke
Nov 30 at 23:22
@D.BenKnoble: Even better, we can replace the double brackets with single brackets and then it’s POSIX compliant.
– Peschke
Nov 30 at 23:22
@Peschke With single brackets, you'd want to add double-quotes around the
$( )
expression.– Gordon Davisson
Dec 1 at 3:49
@Peschke With single brackets, you'd want to add double-quotes around the
$( )
expression.– Gordon Davisson
Dec 1 at 3:49
You definitely want
printf
in the general case. Echo can do strange things if the variable contains backslashes or starts with a dash.– Kevin
Dec 1 at 17:08
You definitely want
printf
in the general case. Echo can do strange things if the variable contains backslashes or starts with a dash.– Kevin
Dec 1 at 17:08
add a comment |
up vote
4
down vote
Get the output in JSON format, and then you'll be able to extract information in a more reliable way:
pv_info=$(pvs -o pv_all,vg_all --unit b --nosuffix --reportformat json)
sdb1_vg=$(
printf '%sn' "$pv_info" |
jq -r '.report.pv|select(.pv_name == "/dev/sdb1").vg_name'
)
if [ "$sdb1_vg" = vg_name ]; then...
Or use a proper programming language with a JSON library instead of a shell (ksh93
does have JSON support though in its upcoming version).
If it's just that one query you want to do, pvs
can also do all the work for you:
sdb1_vg=$(
pvs -o vg_name -S pv_name=/dev/sdb1 --no-heading --config 'log{prefix=""}'
)
Also remember to quote your variables and avoid echo
.
add a comment |
up vote
4
down vote
Get the output in JSON format, and then you'll be able to extract information in a more reliable way:
pv_info=$(pvs -o pv_all,vg_all --unit b --nosuffix --reportformat json)
sdb1_vg=$(
printf '%sn' "$pv_info" |
jq -r '.report.pv|select(.pv_name == "/dev/sdb1").vg_name'
)
if [ "$sdb1_vg" = vg_name ]; then...
Or use a proper programming language with a JSON library instead of a shell (ksh93
does have JSON support though in its upcoming version).
If it's just that one query you want to do, pvs
can also do all the work for you:
sdb1_vg=$(
pvs -o vg_name -S pv_name=/dev/sdb1 --no-heading --config 'log{prefix=""}'
)
Also remember to quote your variables and avoid echo
.
add a comment |
up vote
4
down vote
up vote
4
down vote
Get the output in JSON format, and then you'll be able to extract information in a more reliable way:
pv_info=$(pvs -o pv_all,vg_all --unit b --nosuffix --reportformat json)
sdb1_vg=$(
printf '%sn' "$pv_info" |
jq -r '.report.pv|select(.pv_name == "/dev/sdb1").vg_name'
)
if [ "$sdb1_vg" = vg_name ]; then...
Or use a proper programming language with a JSON library instead of a shell (ksh93
does have JSON support though in its upcoming version).
If it's just that one query you want to do, pvs
can also do all the work for you:
sdb1_vg=$(
pvs -o vg_name -S pv_name=/dev/sdb1 --no-heading --config 'log{prefix=""}'
)
Also remember to quote your variables and avoid echo
.
Get the output in JSON format, and then you'll be able to extract information in a more reliable way:
pv_info=$(pvs -o pv_all,vg_all --unit b --nosuffix --reportformat json)
sdb1_vg=$(
printf '%sn' "$pv_info" |
jq -r '.report.pv|select(.pv_name == "/dev/sdb1").vg_name'
)
if [ "$sdb1_vg" = vg_name ]; then...
Or use a proper programming language with a JSON library instead of a shell (ksh93
does have JSON support though in its upcoming version).
If it's just that one query you want to do, pvs
can also do all the work for you:
sdb1_vg=$(
pvs -o vg_name -S pv_name=/dev/sdb1 --no-heading --config 'log{prefix=""}'
)
Also remember to quote your variables and avoid echo
.
answered Nov 30 at 17:40
Stéphane Chazelas
296k54560905
296k54560905
add a comment |
add a comment |
up vote
2
down vote
If you want to compare the VG from the output, then it might be easier to pre-process that:
# if you still need it
pvs_var=$(pvs | grep "sdb1")
vg_name=$(pvs | grep "sdb1" | awk '{print $2}')
if [ "$vg_name" = "vg_name" ]; then
echo do something
fi
What you were doing with
$($pvs_var | awk '{ print $2 }')
was initiating a command substitution $( ... )
whose first command was $pvs_var
. Bash dutifully substituted the value of the variable and then attempted to execute it. That's not what you wanted.
Another alternative would be to send the variable as a here-string to the awk command:
# ...
if [ $(awk '{print $2}' <<< "$pvs_var") = "vg_name" ]; then
# ...
Here, the command substitution is calling awk and passing it input on stdin -- the contents of the $pvs_var
variable.
add a comment |
up vote
2
down vote
If you want to compare the VG from the output, then it might be easier to pre-process that:
# if you still need it
pvs_var=$(pvs | grep "sdb1")
vg_name=$(pvs | grep "sdb1" | awk '{print $2}')
if [ "$vg_name" = "vg_name" ]; then
echo do something
fi
What you were doing with
$($pvs_var | awk '{ print $2 }')
was initiating a command substitution $( ... )
whose first command was $pvs_var
. Bash dutifully substituted the value of the variable and then attempted to execute it. That's not what you wanted.
Another alternative would be to send the variable as a here-string to the awk command:
# ...
if [ $(awk '{print $2}' <<< "$pvs_var") = "vg_name" ]; then
# ...
Here, the command substitution is calling awk and passing it input on stdin -- the contents of the $pvs_var
variable.
add a comment |
up vote
2
down vote
up vote
2
down vote
If you want to compare the VG from the output, then it might be easier to pre-process that:
# if you still need it
pvs_var=$(pvs | grep "sdb1")
vg_name=$(pvs | grep "sdb1" | awk '{print $2}')
if [ "$vg_name" = "vg_name" ]; then
echo do something
fi
What you were doing with
$($pvs_var | awk '{ print $2 }')
was initiating a command substitution $( ... )
whose first command was $pvs_var
. Bash dutifully substituted the value of the variable and then attempted to execute it. That's not what you wanted.
Another alternative would be to send the variable as a here-string to the awk command:
# ...
if [ $(awk '{print $2}' <<< "$pvs_var") = "vg_name" ]; then
# ...
Here, the command substitution is calling awk and passing it input on stdin -- the contents of the $pvs_var
variable.
If you want to compare the VG from the output, then it might be easier to pre-process that:
# if you still need it
pvs_var=$(pvs | grep "sdb1")
vg_name=$(pvs | grep "sdb1" | awk '{print $2}')
if [ "$vg_name" = "vg_name" ]; then
echo do something
fi
What you were doing with
$($pvs_var | awk '{ print $2 }')
was initiating a command substitution $( ... )
whose first command was $pvs_var
. Bash dutifully substituted the value of the variable and then attempted to execute it. That's not what you wanted.
Another alternative would be to send the variable as a here-string to the awk command:
# ...
if [ $(awk '{print $2}' <<< "$pvs_var") = "vg_name" ]; then
# ...
Here, the command substitution is calling awk and passing it input on stdin -- the contents of the $pvs_var
variable.
answered Nov 30 at 15:55
Jeff Schaller
37.4k1052121
37.4k1052121
add a comment |
add a comment |
up vote
0
down vote
You can try only with awk :
pvs | awk -v search='vg_name' '/sdb1/&&$2==search{exit 1}' || echo "ok"
add a comment |
up vote
0
down vote
You can try only with awk :
pvs | awk -v search='vg_name' '/sdb1/&&$2==search{exit 1}' || echo "ok"
add a comment |
up vote
0
down vote
up vote
0
down vote
You can try only with awk :
pvs | awk -v search='vg_name' '/sdb1/&&$2==search{exit 1}' || echo "ok"
You can try only with awk :
pvs | awk -v search='vg_name' '/sdb1/&&$2==search{exit 1}' || echo "ok"
answered Nov 30 at 16:23
ctac_
1,344117
1,344117
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.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- 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%2f485181%2fhow-to-treat-a-command-output-as-text%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