繁体   English   中英

在shell / bash脚本中使用文件之间的变量

[英]Using variables between files in shell / bash scripting

这个问题已在这里多次发布,但它似乎永远不会回答我的问题。

我有两个脚本。 第一个包含一个或多个变量,第二个脚本需要这些变量。 第二个脚本还需要能够更改第一个脚本中的变量。

我对源(包含变量的第一个脚本运行第二个脚本)或导出(使用环境变量)不感兴趣。 我只是想确保第二个脚本可以读取和更改(获取和设置)第一个脚本中可用的变量。

(PS。如果我误解了采购或出口是如何运作的,并且它适用于我的情况,请告诉我。我不会完全接受这些方法,在我读完之后,我只是不认为那些事情会做我想要的)

环境变量是每个进程。 一个进程无法修改另一个进程中的变量。 你要求的是不可能的。

脚本的常用解决方法是源代码,它通过在同一个shell进程中运行两个脚本来工作,但是你说你不想这样做。

我也有一些想法。 我会使用文件作为变量。 例如,在脚本1中,您用于将变量值写入文件:

echo $varnum1 > /home/username/scriptdir/vars/varnum1
echo $varnum2 > /home/username/scriptdir/vars/varnum2

在脚本2中,您可以将文件中的值读回变量:

$varnum1=$(cat /home/username/scriptdir/vars/varnum1)
$varnum2=$(cat /home/username/scriptdir/vars/varnum2)

两个脚本都可以在任何给定时间读取或写入变量。 从理论上讲,两个脚本可以尝试同时访问同一个文件,我不确定究竟会发生什么,但由于每个文件只包含一个值,因此读取或写入的时间应该非常短。 为了减少那些时间你可以使用ramdisk。

我认为这比编辑对方的脚本要好得多(yuk!)。 实时编辑脚本会使脚本陷入混乱只有在编辑完成后再次启动脚本时才有效。

祝好运!

因此,经过长时间的网络搜索和大量的尝试,我终于找到了某种解决方案。 实际上,这很简单。

但是有一些先决条件。

  1. 你想要设置的变量必须存在于你试图设置它的文件中(我猜这个变量也可以在它不存在时创建,但那不是我想要的这里)。
  2. 你试图设置变量的文件必须存在(显然。我再次猜测也可以这样做,但同样,不是我想要的)。

sudo sed -i 's/^\\(VARNAME=\\).*/\\1VALUE/' FILENAME

因此,即在文件test.ini名为Var1的变量设置为值5
sudo sed -i 's/^\\(Var1=\\).*/\\15/' test.ini


sudo grep -Po '(?<=VARNAME=).*' FILENAME

因此,即从文件test.ini读取名为Var1的变量
sudo grep -Po '(?<=Var1=).*' test.ini


只是要确定

我在运行脚本时发现了一些问题,该脚本设置的变量来自与脚本所在文件夹不同的文件夹。 为确保始终正确,您可以执行以下两项操作之一:

sudo sed -i 's/^\(VARNAME=\).*/\1VALUE/' `dirname $0`/FILENAME

所以基本上,只需将`dirname $0`/ (包括反引号)放在文件名前面。

另一种选择是使`dirname $0`/变量(再次包括反引号),这看起来像这样。

my_dir=`dirname $0`

sudo sed -i 's/^\(VARNAME=\).*/\1VALUE/' $my_dir/FILENAME

所以基本上,如果你有一个名为test.ini的文件,它包含这一行: Var1= (在我的测试中,变量可以开始为空,你仍然可以设置它。里程可能会有所不同。),你将能够设置并获取Var1的值


我可以确认这是有效的(对我而言),但是既然你们都有了更多的脚本编写经验,那么我没想出来,我猜这不是一个好方法。

另外,我无法告诉你关于上述命令中发生的事情的第一件事,我只知道它们有效。

所以,如果我做了一些愚蠢的事情,或者你可以向我解释上述命令中发生了什么,请告诉我。 我非常想知道如果这个解决方案,你们会怎么想。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM