下面的代码在 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/bash
NOT开头你的脚本#!/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——它会在你陷入麻烦之前指出许多基本的错误。