[英]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.