管道日了狗-while read line大坑

想着定义个全局变量,用sh 函数修改,结果遇到了管道的坑,先贴错误代码:

#!/bin/sh

HEIGHT="null"
WIDTH="default"
SRC_YUV=
DEST_DIR=
MAX_QP=
MIN_QP=

read_para_from_file(){
	cat $1 | while read line  ##划重点--->管道的最后一个命令都是在子Shell中执行的。这意味着在子Shell中赋值的变量对父Shell是无效的。所以当我们将管道输出传送到一个循环结构,填入随后将要使用的变量,那么就会产生很多问题。一旦循环完成,其所依赖的变量就不存在了。
	do
		echo $line
		t_name=`echo $line |awk -F ' ' '{print $1}'`
		t_value=`echo $line |awk -F ' ' '{print $2}'`
		echo "k-v :$t_name -> $t_value"
		if [ $t_name = "width" ] ; then
			echo "1 ->"$WIDTH
			WIDTH=$t_value
			echo "1 ->"$WIDTH
			continue
		fi
		if [ $t_name = "height" ] ; then
			echo "2 ->"$HEIGHT
			HEIGHT=$t_value
			echo "2 ->"$HEIGHT
			continue
		fi
		if [ $t_name = "src_yuv" ] ; then
			SRC_YUV=$t_value
			echo "3 ->"$SRC_YUV
			continue
		fi
		if [ $t_name = "dest_dir" ] ; then
			DEST_DIR=$t_value
			echo "4"
			continue
		fi
		if [ $t_name = "max_qp" ] ; then
			MIN_QP=$t_value
			echo "5"
			continue
		fi
		if [ $t_name = "min_qp" ] ; then
			MAX_QP=$t_value
			echo "6"
			continue
		fi
		echo "get nothing -> "$line
	done 
}
show_global_para(){
	echo "show global var ->"
	echo "WIDTH -> $WIDTH"
	echo "HEIGHT -> $HEIGHT"
	echo "SRC_YUV -> $SRC_YUV"
	echo "DEST_DIR -> $DEST_DIR"
	echo "MAX_QP -> $MAX_QP"
	echo "MIN_QP -> $MIN_QP"
}

read_para_from_file $1
show_global_para
while read line命令从管道中输出中读取数据。注意,while是管道的最后一个命令,将在子Shell中运行。
管道的最后一个命令都是在子Shell中执行的。这意味着在子Shell中赋值的变量对父Shell是无效的。所以当我们将管道输出传送到一个循环结构,填入随后将要使用的变量,那么就会产生很多问题。一旦循环完成,其所依赖的变量就不存在了。


修改后:

#!/bin/sh

HEIGHT="null"
WIDTH="default"
SRC_YUV=
DEST_DIR=
MAX_QP=
MIN_QP=

read_para_from_file(){
	#cat $1 | while read line 
	#lines=`cat $1`
	while read line  ##划重点  
	do
		echo $line
		t_name=`echo $line |awk -F ' ' '{print $1}'`
		t_value=`echo $line |awk -F ' ' '{print $2}'`
		echo "k-v :$t_name -> $t_value"
		if [ $t_name = "width" ] ; then
			echo "1 ->"$WIDTH
			WIDTH=$t_value
			echo "1 ->"$WIDTH
			continue
		fi
		if [ $t_name = "height" ] ; then
			echo "2 ->"$HEIGHT
			HEIGHT=$t_value
			echo "2 ->"$HEIGHT
			continue
		fi
		if [ $t_name = "src_yuv" ] ; then
			SRC_YUV=$t_value
			echo "3 ->"$SRC_YUV
			continue
		fi
		if [ $t_name = "dest_dir" ] ; then
			DEST_DIR=$t_value
			echo "4"
			continue
		fi
		if [ $t_name = "max_qp" ] ; then
			MIN_QP=$t_value
			echo "5"
			continue
		fi
		if [ $t_name = "min_qp" ] ; then
			MAX_QP=$t_value
			echo "6"
			continue
		fi
		echo "get nothing -> "$line
	done  < $1  ##重定向
}
show_global_para(){
	echo "show global var ->"
	echo "WIDTH -> $WIDTH"
	echo "HEIGHT -> $HEIGHT"
	echo "SRC_YUV -> $SRC_YUV"
	echo "DEST_DIR -> $DEST_DIR"
	echo "MAX_QP -> $MAX_QP"
	echo "MIN_QP -> $MIN_QP"
}

read_para_from_file $1
show_global_para





你可能感兴趣的:(嵌入式linux)