Linux Bash:使用命令中的变量获取命令输出

Linux Bash:使用命令中的变量获取命令输出,linux,string,bash,shell,variables,Linux,String,Bash,Shell,Variables,我有一个bash/shell脚本,希望将命令输出存储在变量(EXCLUDE_PATTERN)中,并且命令本身也包含变量(FOLDERS和BUPATH) 此命令的目标是将变量文件夹中的空格替换为“--exclude=“$BUPATH,以便在tar命令中使用 如果已在脚本中定义了以下变量: FOLDERS='folder1 folder2 folder3' BUPATH='/opt/mypath' CONFIG_BACKUP="/storage/backup.tar.gz" 文件夹是一个包含排除文

我有一个bash/shell脚本,希望将命令输出存储在变量(EXCLUDE_PATTERN)中,并且命令本身也包含变量(FOLDERSBUPATH

此命令的目标是将变量文件夹中的空格替换为“--exclude=“$BUPATH,以便在tar命令中使用

如果已在脚本中定义了以下变量:

FOLDERS='folder1 folder2 folder3'
BUPATH='/opt/mypath'
CONFIG_BACKUP="/storage/backup.tar.gz"
文件夹是一个包含排除文件夹列表的变量

BUPATH是一个带有路径的变量

现在,我想用以下tar命令的模式定义一个变量EXCLUDE_PATTERN(尝试了两种变体):

然后脚本运行tar命令:

tar -C \"$BUPATH\" --exclude=\"$BUPATH/$EXCLUDE_PATTERN\" -czf \"$CONFIG_BACKUP\" .
变量排除模式似乎未识别BUPATH变量:

tar -C "/opt/mypath" --exclude="/opt/mypath/folder1" --exclude="${BUPATH}/folder2" --exclude="${BUPATH}/folder3" -czf "/storage/config.tar.gz" .
预期的命令应为:

tar -C "/opt/mypath" --exclude="/opt/mypath/folder1" --exclude="/opt/mypath/folder2" --exclude="/opt/mypath/folder3" -czf "/storage/config.tar.gz" .
我希望有人能帮我:)

FOLDERS='folder1 folder2 folder3'

BUPATH='/opt/mypath'

CONFIG_BACKUP=“/storage/BACKUP.tar.gz”

预期的命令应为:

tar -C "/opt/mypath" --exclude="/opt/mypath/folder1" --exclude="/opt/mypath/folder2" --exclude="/opt/mypath/folder3" -czf "/storage/config.tar.gz" .
tar-C“/opt/mypath”--exclude=“/opt/mypath/folder1”--exclude=“/opt/mypath/folder2”--exclude=“/opt/mypath/folder3”--czf”/storage/config.tar.gz”

这很简单。我喜欢使用
xargs printf
转换列表,例如,预先添加一些内容:

# creates a bash array from newline separated output
IFS=$'\n' tarexcludes=($(<<<"$FOLDERS" xargs -n1 printf "--exclude=%s/%s\n" "$BUPATH"))
echo tar -C "/opt/mypath" "${tarexcludes[@]}" -czf "$CONFIG_BACKUP" .
注:

  • 不要使用反勾号。他们很沮丧,我不喜欢他们
  • 您也可以使用
    #
    的组合,而不是
    /
    来解决您的问题

    EXCLUDE_模式=`echo$FOLDERS|sed-e“s###\”--EXCLUDE=$BUPATH\“/#g”`
    
    但这将输出:
    folder1“--exclude=/opt/mypath”/folder2“--exclude=/opt/mypath”/folder3

    要归档预期输出,需要进行以下修改:

    EXCLUDE\u模式=`echo$FOLDERS | sed-e“s”#\(\s\+\)#--EXCLUDE=\“$BUPATH/\1\”g”`
    
    这将输出:
    --exclude=“/opt/mypath/folder1”--exclude=“/opt/mypath/folder2”--exclude=“/opt/mypath/folder3”

    有关更多信息,请阅读StackOverflow帖子:

    为什么要转义那些双引号?我也尝试过不使用引号,但没有任何区别(更新)为什么要转义
    ?您真的有一个名为
    ”的目录吗?
    cd./\”
    有效吗?
    cd./\“/opt/mypath
    有效吗?
    tarexcludes=($(<<<"$FOLDERS" tr ' ' '\n' | sed "s~^~--exclude=$BUPATH/~"))
    
    tarexcludes=($(<<<"$FOLDERS" tr ' ' '\n' | awk -v BUPATH="$BUPATH" '{print "--exclude=" BUPATH "/" $0}')