将命令字符串的一部分作为变量存储在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),但是它不起作用。

我知道我可以只放入一个temp变量并在完成后进行替换,但是我真的很想知道如何在bash中组合命令。

edit2:创建了一个简单版本以测试以下建议的答案:

#!/bin/bash
tmpcmd="history| grep "
echo "$tmpcmd ls"|bash

输出为:空白

解决方法

您需要将所有命令存储为字符串,省略'$(...)',并运行命令...并返回其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禁用非交互式shell中的历史记录。在此类shell脚本示例中,最好不要使用history。另请参阅:
https://unix.stackexchange.com/q/5684/13411
https://unix.stackexchange.com/q/112354/13411