[英]Bash: Get command output with variables inside the command
我有一个bash / shell脚本,想将命令输出存储在变量( EXCLUDE_PATTERN )中,并且命令本身也包含变量( FOLDERS和BUPATH )。
此命令的目标是用“ --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}')
笔记:
<<<"$FOLDERS"
是bash的此处字符串 tr ' ' '\\n'
用空格代替换行符。 因此它可以用sed解析。 tarexcludes=( ... )
创建一个bash数组。 bashguide数组 echo $FOLDERS
将在单行上输出,并且sed解析行。 因此,只需用换行符替换空格。 或者,使用xrandr -n1
或printf "%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.