存储来自 bash 输出的变量

存储来自 bash 输出的变量

有一个 bash 脚本来创建一些文件的备份,它是在 Cron 中设置的。

bash 命令(包括输出)为:

[vagrant@localCentOS71 ~]$ sudo create_backup.sh
Check if all is good ...
done
Doing it ..
Backup file is: 1482419092_backup.tar ... Yeah!
done

如何1482419092_backup.tar在同一 shell 命令中存储在变量中以供以后使用。

目标是在一个 shell 命令中创建指向刚刚创建的备份文件的文件夹的符号链接。

到目前为止我已经得到:

create_backup.sh && ln -s $BACKUP_FILE /folder/here

答案1

仅编辑脚本会简单得多,但如果不可能,您可以这样做:

BACKUP_FILE=$(create_backup.sh | grep -oP 'Backup file is:\s*\K\S+') && 
ln -s $BACKUP_FILE /folder/here

答案2

您的 shell 脚本由另一个 shell 执行,该 shell 是一个子进程。

没有直接的方法将变量从子进程传递到其父进程。

一种方法可能是使用点(“.”)运算符使用当前 shell 执行脚本,但是任何对 exit 的调用都会停止当前 shell,并且您将继承脚本的所有变量:

. ./create_backup.sh && ln -s $BACKUP_FILE /folder/here

更好的方法是使用文件来存储变量。

在脚本中的某个时刻,您保存变量的值:

declare -p BACKUP_FILE > /tmp/somefile.sh

或者 :

echo BACKUP_FILE=\""$BACKUP_FILE"\" > /tmp/somefile.sh

然后你可以执行:

if ./create_backup.sh
then . /tmp/somefile.sh
     ln -s $BACKUP_FILE /folder/here
fi

另一种没有文件的方法是从脚本的标准输入中读取:

OUTSCRIPT=` ./create_backup.sh | grep 'BACKUP_FILE=' `

这是另一个解决方案:括号“()”创建一个子 shell 来保护您免受脚本的退出调用和不需要的变量的影响,并且您不必修改脚本:

if ( . ./create_backup.sh && declare -p BACKUP_FILE > /tmp/somefile )
then . /tmp/somefile
     ln -s $BACKUP_FILE /folder/here
fi

相关内容