无法使用while [duplicate]修改bash脚本case语句中的变量

问题描述 投票:0回答:1

此问题已经在这里有了答案:

我有一个简单的bash脚本,如下所示:

interval=""
cat conf.param|\
while read param
do
   item_=$(echo $param|cut -d "=" -f1)    
   case ${item_} in
        interval)
                interval=$(echo $param|cut -d "=" -f2)                
                echo $interval
                ;;
        method)
                method=$(echo $param|cut -d "=" -f2)
                ;;
  esac
done
echo "${interval}"

它读取文件的内容并将它们存储在不同的变量中。问题是变量没有在案例段中正确设置。我提出了两个回声。第一个(内部情况)正确显示了间隔值'2',但是esac语句之后的第二个什么也不显示!它显示一个空的空白行。conf.param是一个简单的文本文件。它有更多行,我只打印了两行:

interval=2
method="POST"
linux bash switch-statement
1个回答
1
投票

[您的问题是,使用管道(“ cat conf.param |而读取参数”),您调用了第二个外壳程序,该外壳程序无法将其变量导出到调用方。参见以下示例:

interval=""
cat tmp.txt | while read param; do       ##### DON'T DO THIS
  interval="A$interval"
done
echo "First attempt: $interval"

interval=""
while read param; do
  interval="A$interval"
done < tmp.txt                           ##### BUT DO THIS INSTEAD
echo "Redirection attempt: $interval"

文件tmp.txt包含4行;脚本的输出为:

第一次尝试:

重定向尝试:AAAA

如您所见,第一次尝试将保留间隔的旧值。因为没有创建新进程,所以第二次/重定向尝试有效。

© www.soinside.com 2019 - 2024. All rights reserved.