[英]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!)。 实时编辑脚本会使脚本陷入混乱,只有在编辑完成后再次启动脚本时才有效。
祝好运!
因此,经过长时间的网络搜索和大量的尝试,我终于找到了某种解决方案。 实际上,这很简单。
但是有一些先决条件。
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.