Linux Bash:使用命令中的变量获取命令输出
我有一个bash/shell脚本,希望将命令输出存储在变量(EXCLUDE_PATTERN)中,并且命令本身也包含变量(FOLDERS和BUPATH) 此命令的目标是将变量文件夹中的空格替换为“--exclude=“$BUPATH,以便在tar命令中使用 如果已在脚本中定义了以下变量: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" 文件夹是一个包含排除文
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”`
有关更多信息,请阅读StackOverflow帖子:--exclude=“/opt/mypath/folder1”--exclude=“/opt/mypath/folder2”--exclude=“/opt/mypath/folder3”
为什么要转义那些双引号?我也尝试过不使用引号,但没有任何区别(更新)为什么要转义
”“
”的目录吗?“
有效吗?cd./\”
有效吗?cd./\“/opt/mypath
tarexcludes=($(<<<"$FOLDERS" tr ' ' '\n' | sed "s~^~--exclude=$BUPATH/~"))
tarexcludes=($(<<<"$FOLDERS" tr ' ' '\n' | awk -v BUPATH="$BUPATH" '{print "--exclude=" BUPATH "/" $0}')