繁体   English   中英

Bash:获取命令输出以及命令内部的变量

[英]Bash: Get command output with variables inside the command

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

此命令的目标是用“ --exclude =” $ BUPATH“替换变量FOLDERS中的空格,以在tar命令中使用

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

FOLDERS='folder1 folder2 folder3'
BUPATH='/opt/mypath'
CONFIG_BACKUP="/storage/backup.tar.gz"

FOLDER是具有排除文件夹列表的变量

BUPATH是具有路径的变量

现在,我想为以下tar命令的模式定义变量EXCLUDE_PATTERN (尝试2种变化):

EXCLUDE_PATTERN=`echo $FOLDERS | sed 's/\ /" --exclude="$BUPATH\//g'`
EXCLUDE_PATTERN=`echo $FOLDERS | sed 's/\ /" --exclude="${BUPATH}\//g'`

然后脚本运行tar命令:

tar -C \"$BUPATH\" --exclude=\"$BUPATH/$EXCLUDE_PATTERN\" -czf \"$CONFIG_BACKUP\" .

似乎变量EXCLUDE_PATTERN无法识别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”。

好吧,这很简单。 我喜欢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" .

但是,您也可以选择一个独特的sed命令分隔符,然后执行以下操作:

tarexcludes=($(<<<"$FOLDERS" tr ' ' '\n' | sed "s~^~--exclude=$BUPATH/~"))

或使用awk

tarexcludes=($(<<<"$FOLDERS" tr ' ' '\n' | awk -v BUPATH="$BUPATH" '{print "--exclude=" BUPATH "/" $0}')

笔记:

  • 不要使用反引号`。 他们灰心丧气,我不喜欢他们。 bash过时和不赞成使用的语法
  • <<<"$FOLDERS"是bash的此处字符串
  • tr ' ' '\\n'用空格代替换行符。 因此它可以用sed解析。
  • tarexcludes=( ... )创建一个bash数组。 bashguide数组
  • 您的命令不起作用,因为echo $FOLDERS将在单行上输出,并且sed解析行。 因此,只需用换行符替换空格。 或者,使用xrandr -n1printf "%s" $FOLDERS
  • 按照约定,大写变量名按照约定保留给环境导出的变量。 在脚本中使用小写的变量名。

您也可以结合使用" #代替' /来解决您的问题。

EXCLUDE_PATTERN=`echo $FOLDERS |  sed -e "s#\ #\" --exclude=$BUPATH\"/#g"`

但这将输出:
folder1" --exclude=/opt/mypath"/folder2" --exclude=/opt/mypath"/folder3

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

EXCLUDE_PATTERN=`echo $FOLDERS |  sed -e "s#\(\S\+\)# --exclude=\"$BUPATH/\1\"#g"`

这将输出:
--exclude="/opt/mypath/folder1" --exclude="/opt/mypath/folder2" --exclude="/opt/mypath/folder3"

有关更多信息,请阅读StackOverflow文章:
转义sed替换模式的字符串

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM