将部分命令字符串存储为 bash 中的变量
Storing part of a command string as a variable in bash
我正在使用一个变量来组合命令:
#!/bin/bash
cmd=$(sudo -i -u $domain wp --path=$path)
$cmd post create --post_type=page --post_status=publish --post_title='Page1'
$cmd post create --post_type=page --post_status=publish --post_title='Page110'
$cmd widget delete $($cmd widget list sidebar-1 --format=ids)
edit1:示例使用 cmd='sudo -i -u $domain wp --path=$path';echo $cmd |bash
#!/bin/bash
cmd='sudo -i -u $domain wp --path=$path'
echo $cmd --post_type=page --post_status=publish --post_title='Page1'|bash
echo $cmd widget delete $(echo $cmd widget list sidebar-1 --format=ids|bash)|bash
我在尝试执行上述操作时遇到错误。我试过使用 'single quotes'
和 "double quotes"
而不是 (parenthesis)
,但它不起作用。
我知道我可以只放入一个临时变量并在完成后替换,但我真的很想知道如何在 bash.
中组合命令
edit2:创建了一个简单版本来测试建议的答案:
#!/bin/bash
tmpcmd="history| grep "
echo "$tmpcmd ls"|bash
输出为:空白
您需要将所有命令存储为字符串,省略“$(...)”,并运行命令 ...
和 returns 其 STDOUT(不是您想要的)。
然后使用 echo "$cmd1 $cmd2 ..." | bash
执行 shell 中的结果命令。所有命令的双引号都很重要,以防止将某些字符串视为 echo
:
的选项
cmd1='command 1 string'
cmd2='command 2 string'
# Execute: command 1 string command 2 string
echo "$cmd1 $cmd2" | bash
示例 1:
cmd1='sudo'
cmd2='purge'
# Runs: sudo purge
echo "$cmd1 $cmd2" | bash
示例 2:
脚本:
#!/usr/bin/env bash
tmpcmd="( echo 'foo' ; echo 'bar' ) | grep"
echo "with variable interpolation:"
echo "$tmpcmd 'foo'" | bash
echo "without variable interpolation:"
echo "( echo 'foo' ; echo 'bar' ) | grep 'foo'" | bash
echo "original command:"
( echo 'foo' ; echo 'bar' ) | grep 'foo'
echo 'done'
无论命令是否被内插以及是否按原样执行,输出都是相同的:
with variable interpolation:
foo
without variable interpolation:
foo
original command:
foo
done
示例 4(基于 OP 的示例,确认它并不像某些人预期的那样工作):
#!/usr/bin/env bash
ls > /dev/null
tmpcmd="history | grep"
echo "with variable interpolation:"
echo "$tmpcmd ls" | bash
echo "without variable interpolation:"
echo "history | grep ls" | bash
echo "original command:"
history | grep ls
echo 'done'
输出:
with variable interpolation:
without variable interpolation:
original command:
done
示例 4 不打印 history
命令的任何输出 因为 bash 默认禁用 non-interactive shells 的历史记录.最好不要在这样的 shell 脚本示例中使用 history
。另见:
https://unix.stackexchange.com/q/5684/13411
https://unix.stackexchange.com/q/112354/13411
我正在使用一个变量来组合命令:
#!/bin/bash
cmd=$(sudo -i -u $domain wp --path=$path)
$cmd post create --post_type=page --post_status=publish --post_title='Page1'
$cmd post create --post_type=page --post_status=publish --post_title='Page110'
$cmd widget delete $($cmd widget list sidebar-1 --format=ids)
edit1:示例使用 cmd='sudo -i -u $domain wp --path=$path';echo $cmd |bash
#!/bin/bash
cmd='sudo -i -u $domain wp --path=$path'
echo $cmd --post_type=page --post_status=publish --post_title='Page1'|bash
echo $cmd widget delete $(echo $cmd widget list sidebar-1 --format=ids|bash)|bash
我在尝试执行上述操作时遇到错误。我试过使用 'single quotes'
和 "double quotes"
而不是 (parenthesis)
,但它不起作用。
我知道我可以只放入一个临时变量并在完成后替换,但我真的很想知道如何在 bash.
中组合命令edit2:创建了一个简单版本来测试建议的答案:
#!/bin/bash
tmpcmd="history| grep "
echo "$tmpcmd ls"|bash
输出为:空白
您需要将所有命令存储为字符串,省略“$(...)”,并运行命令 ...
和 returns 其 STDOUT(不是您想要的)。
然后使用 echo "$cmd1 $cmd2 ..." | bash
执行 shell 中的结果命令。所有命令的双引号都很重要,以防止将某些字符串视为 echo
:
cmd1='command 1 string'
cmd2='command 2 string'
# Execute: command 1 string command 2 string
echo "$cmd1 $cmd2" | bash
示例 1:
cmd1='sudo'
cmd2='purge'
# Runs: sudo purge
echo "$cmd1 $cmd2" | bash
示例 2:
脚本:
#!/usr/bin/env bash
tmpcmd="( echo 'foo' ; echo 'bar' ) | grep"
echo "with variable interpolation:"
echo "$tmpcmd 'foo'" | bash
echo "without variable interpolation:"
echo "( echo 'foo' ; echo 'bar' ) | grep 'foo'" | bash
echo "original command:"
( echo 'foo' ; echo 'bar' ) | grep 'foo'
echo 'done'
无论命令是否被内插以及是否按原样执行,输出都是相同的:
with variable interpolation:
foo
without variable interpolation:
foo
original command:
foo
done
示例 4(基于 OP 的示例,确认它并不像某些人预期的那样工作):
#!/usr/bin/env bash
ls > /dev/null
tmpcmd="history | grep"
echo "with variable interpolation:"
echo "$tmpcmd ls" | bash
echo "without variable interpolation:"
echo "history | grep ls" | bash
echo "original command:"
history | grep ls
echo 'done'
输出:
with variable interpolation:
without variable interpolation:
original command:
done
示例 4 不打印 history
命令的任何输出 因为 bash 默认禁用 non-interactive shells 的历史记录.最好不要在这样的 shell 脚本示例中使用 history
。另见:
https://unix.stackexchange.com/q/5684/13411
https://unix.stackexchange.com/q/112354/13411