在 Bash 中,变量导出不起作用

在 Bash 中,变量导出不起作用

下面的代码在 bash 中不起作用,而在 sh 中却可以工作,尝试了许多解决方法,例如在管道读取后放入 while,但没有起作用。变量没有被导出。有人可以建议需要做什么吗

 function() {
 RECORD = $1
 echo "$RECORD"|read var1 var 2 var3
 var1=`echo $var1`
 var2 =`echo $var2`
 var3=`echo $var3`
 export var1 var2 var3
 }
 ....
 while read EACH_RECORD
 do
 function "EACH_RECORD"
 *action on fecthed variables*

答案1

这里有很多错误。让我按顺序介绍一下:

RECORD = $1

在 shell 中,不允许在=赋值周围使用空格,因此这个(以及后面的一些赋值)将不起作用。这实际上会尝试运行RECORD以“=”命名的命令,并将的值$1作为参数。在 shell 中,空格非常重要;在大多数地方,它们要么是完全必需的,要么是完全禁止的。在您了解它们在何处是可选的之前,请务必小心地从您正在使用的任何示例中准确复制空格。

echo "$RECORD"|read var1 var 2 var3

管道的元素(例如read此处的命令)在子 shell 中运行,这意味着在其中进行的变量赋值发生在子 shell 中……并在子 shell 退出时丢失。此外,变量名中间不能有空格 ( var 2)。

不用管道你也可以这样做:

read var1 var2 var3 <<<"$RECORD"

(但请注意,这<<<只是一种 bashism,并非在所有 shell 中都可用。请确保以#!/bin/bashNOT开头你的脚本#!/bin/sh。)

 var1=`echo $var1`
 var2 =`echo $var2`
 var3=`echo $var3`

即使删除了第二行中的杂散空格,这些也没有任何用处。它们获取变量的值,回显它们,捕获 echo 命令的输出,然后将它们直接填充回变量中。在此过程中可能会发生一些变化(例如通配符扩展),但我很确定这些不是您希望发生的事情。(实际上,您几乎应该始终将变量引用放在双引号中,以防止意外的通配符扩展和单词拆分等情况。)所以就丢掉它们吧。

export var1 var2 var3

export告诉 shell 将这些变量的值导出到从此 shell 运行的命令中——也就是说,它们被导出向下流程层次结构,而不是向上运行此函数的程序。但在本例中,函数与脚本的主要部分在同一个进程中运行,因此无需导入即可在任一方向共享变量。只要变量未声明local,它们就会自动可供脚本的其余部分使用。因此,也将其丢弃。

(请注意,没有办法将变量导出到进程层次结构中。子 shell 或其他子进程中发生的事件仅保留在该子进程中。)

 function "EACH_RECORD"

您需要$在 前面加上EACH_RECORD,否则它只会作为文字字符串传递。

顺便说一句,我强烈建议你通过shellcheck.net——它会在你陷入麻烦之前指出许多基本的错误。

相关内容