有没有人知道如何在KSH if,case或loop语句中设置具有全局范围的变量?
我正在尝试运行以下代码,但脚本只回显“H”而不是输入文件中看到的实际值。
CFG_DIR=${WORK_DIR}/cfg
CFG_FILE=${CFG_DIR}/$1
NAME=$(echo $CFG_FILE | cut -f1 -d\.)
UPPER_BUS_NETWORK="H"
cat ${CFG_FILE} | grep -v ^\# |
while read CLINE
do
PROPERTY=$(echo $CLINE | cut -f1 -d\=)
VALUE=$(echo $CLINE | cut -f2 -d\=)
if [ ${PROPERTY} = "UpperBusService" ]; then
UPPER_BUS_SERVICE="${VALUE}"
fi
if [ ${PROPERTY} = "UpperBusNetwork" ]; then
UPPER_BUS_NETWORK="${VALUE}"
fi
done
echo ${UPPER_BUS_NETWORK}
答案 0 :(得分:0)
你确定你在ksh中运行吗?哪个版本? Ksh93没有在while
循环中设置子shell。但是,Bash,dash,ash和 pdksh 可以。我不确定ksh88。
比较
$ bash -c 'a=111; echo foo | while read bar; do echo $a; a=222; echo $a; done; echo "after: $a"'
111
222
after: 111
到
ksh -c 'a=111; echo foo | while read bar; do echo $a; a=222; echo $a; done; echo "after: $a"'
111
222
after: 222
Zsh给出与ksh93相同的结果。
不幸的是,pdksh不支持进程替换,而ksh93不支持,但是当重定向到done
循环的while
时却不支持,因此无法使用在Bash中工作的常用解决方案。这就是它的样子:
# Bash (or Zsh)
while read ...
do
...
done < <(command)
使用临时文件可能是唯一的解决方案:
command > tmpfile
while read
do
...
done < tmpfile
一些补充说明:
cat ${CFG_FILE} | grep -v ^\#
做grep -v ^\# "${CFG_FILE}"
read -r
,以便按字面处理反斜杠NAME=$(echo $CFG_FILE | cut -f1 -d\.)
和NAME=${CFG_FILE%%.*}
VALUE=${#*=}; VALUE=${VALUE%%=*}
。
cat
命令