【问题标题】:incrementing an environmental variable增加环境变量
【发布时间】:2014-04-28 05:13:42
【问题描述】:

我需要通过以下步骤增加一个环境变量:

envar=1
export envar
sh script_incrementation
echo $envar

其中 script_incrementation 包含如下内容:

#! /bin/sh
envar=$[envar+1] #I've tried also other methods of incrementation
export envar

无论我做什么,在退出脚本后,变量仍然保持其初始值 1。

感谢您的宝贵时间。

【问题讨论】:

  • 你使用的是 bash 还是 sh?您的文件指示 sh,但您标记了 bash。请注意,它们不是一回事。
  • 这里无关紧要。

标签: linux bash shell sh


【解决方案1】:

shell 脚本在其自己的 shell 中执行,因此除非您获取它,否则您无法影响外部 shell。有关该讨论的详细信息,请参阅this question

考虑以下脚本,我将其命名为Foo.sh

#!/bin/bash

export HELLO=$(($HELLO+1))

假设在外壳中,我定义了一个环境变量:

export HELLO=1

如果我这样运行脚本,它会在自己的 shell 中运行,不会影响父级。

./Foo.sh

但是,如果我获取它,它只会执行 current shell 中的命令,并会达到预期的效果。

. Foo.sh
echo $HELLO # prints 2

【讨论】:

  • 它有效,谢谢伙计,我不敢相信我花了整整一个晚上想知道可能出了什么问题。
  • @SouthPole,不客气。命令行很有趣,但并不总是显而易见的。 :)
  • 应该是export HELLO=1。 Bash 区分大小写,但不能只编辑一个符号。
  • 值得一提的是,$(( expression )) 是一个arithmetic expansion,它允许计算算术表达式并替换结果
【解决方案2】:

你的脚本不能改变调用进程(shell)的环境,它只是继承它。

所以,如果你export foo=bar,然后用你的脚本调用sh(一个新进程),脚本将看到$foo的值(即"bar"),它就能更改它自己的副本 - 但这不会影响父进程的环境(您导出变量的位置)。

您可以在原始 shell 中简单地 source 您的脚本,即运行

source increment_script.sh

. increment_script.sh

这将改变变量的值。

这是因为source脚本避免产生新的shell(进程)。

另一个技巧是让您的脚本输出更改后的环境,然后评估该输出,例如:

counter=$[counter+1]
echo "counter=$counter"

然后运行它

eval `increment_script.sh`

【讨论】:

  • $[...] 早于 POSIX 标准;请改用$((...))
猜你喜欢
  • 2022-01-01
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
  • 2014-09-30
  • 1970-01-01
  • 2020-12-07
相关资源
最近更新 更多