pet*_*ohn 9 linux variables bash
请考虑以下脚本:
#!/bin/bash
num=0
cat file | while read line; do
echo "$line"
lines[$num]="$line"
((num++))
echo "num = $num"
done
echo "end num = $num"
i=0
while [ $i -lt $num ]; do
echo "${lines[$i]}"
((i++))
done
Run Code Online (Sandbox Code Playgroud)
通常,它应该逐行读取文件,将结果存储在一个数组中,然后通过数组并逐行打印.问题是变量$ num在第一个循环退出后以某种方式重置.这个脚本的输出对我来说是(使用带有一些随机垃圾的文件):
dsfkljhhsdfsdfshdjkfgd
num = 1
fdfgdfgdfg
num = 2
dfgdfgdfgdfg
num = 3
dfgdfgdfgdfgdfg
num = 4
dfgdfgdfgdfgdfgd
num = 5
fgdfgdfgdfg
num = 6
dfgdfgdfgdfg
num = 7
dfgdfgdfgdfgdfg
num = 8
dfgdfgdfgdfg
num = 9
dfgdfgdgdgdg
num = 10
dfgdffgdgdgdg
num = 11
end num = 0
Run Code Online (Sandbox Code Playgroud)
为什么是这样?如何记住变量?我在SUSE Linux 10上使用bash 3.1.17.
pax*_*blo 15
为什么?这是因为:
cat file | while read line; do
echo "$line"
lines[$num]="$line"
((num++))
echo "num = $num"
done
Run Code Online (Sandbox Code Playgroud)
while在一个单独的进程中运行该语句,具有自己的环境,而不是触及父环境.同样地,你会发现lines数组也不存在.
以下简化脚本显示了此操作:
#!/bin/bash
export xyzzy=42
echo urk | while read line; do
xyzzy=999
echo $xyzzy
done
echo $xyzzy
Run Code Online (Sandbox Code Playgroud)
该脚本的输出是:
999
42
Run Code Online (Sandbox Code Playgroud)
因为变量to的设置999是在子进程中完成的.
最重要的是,如果您希望信息反映在当前流程(脚本)中,您需要在脚本中完成工作或找到其他方法从子流程中获取信息.
如果您使用输入重定向而不是启动子流程管道,它应该可以按您的意愿工作.那是因为该while位然后在当前进程的上下文中完成,而不是在管道中的单独进程.例如:
#!/bin/bash
export xyzzy=42
while read line; do
xyzzy=999
echo $xyzzy
done <<EOF
hello
EOF
echo $xyzzy
Run Code Online (Sandbox Code Playgroud)
将产生:
999
999
Run Code Online (Sandbox Code Playgroud)
对于您的具体情况,请替换:
done <<EOF
hello
EOF
Run Code Online (Sandbox Code Playgroud)
有:
done <file
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17753 次 |
| 最近记录: |