簡體   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