KSH,在管道中读取使用
KSH, read used in a pipeline
我正在尝试学习 Here Documents Korn 中的 IO 重定向 Shell。
我使用 "read" 内置来测试这些概念。
我写了一个示例程序如下
#!/usr/bin/ksh
cat << ONE | wc -l | read word | if [ $word -eq 1 ]; then cat << TWO ; fi | wc -l | read word | if [ $word -eq 2 ]; then cat << THREE ; fi
1
ONE
1
2
TWO
1
2
3
THREE
我希望输出为:
1
2
3
但是输出是
[: argument expected
我认为 $word 变量是空的。
然后我重写了程序如下,效果很好:
cat << ONE | wc -l | { read word ; if [ $word -eq 1 ]; then cat << TWO ; fi ;} | wc -l | { read word ; if [ $word -eq 2 ]; then cat << THREE ; fi ;}
1
ONE
1
2
TWO
1
2
3
THREE
输出符合预期:
1
2
3
我的问题是关于第一个片段:
- 为什么管道中的 "read word" 命令没有更新单词
shell 中的变量和后续命令无法使用
它。
- 此外,“read word”不会向标准输出写入任何内容,因此
在管道中使用它是不对的,但我想检查一下。
- 但是,"read word" 之后的命令不会读取任何内容
来自标准输入,所以应该没问题。
请记住,管道的每一侧 (|
) 都是一个单独的 shell 会话。
在您的第一次尝试中您有 ... | wc -l | read word | if ...
,因此虽然 wc -l
的结果将被读取并存储在下一个 shell 会话的变量 word
中,但此变量不会传递到下一个 shell 会话。由于变量 word
现在未定义,您的语句 if [ $word -eq 1 ]
变为 if [ -eq -1 ]
并因此出现错误。
在您的第二次尝试中,您的 { read word ; if [ $word -eq 1 ]; then cat << TWO ; fi ;}
构造表示一个单独的 shell 会话,其中变量 word
被初始化(具有 wc -l
的结果),并且因为这仍然是单个 shell 该变量现在可以在您的 if/then
块中使用。
我正在尝试学习 Here Documents Korn 中的 IO 重定向 Shell。 我使用 "read" 内置来测试这些概念。
我写了一个示例程序如下
#!/usr/bin/ksh
cat << ONE | wc -l | read word | if [ $word -eq 1 ]; then cat << TWO ; fi | wc -l | read word | if [ $word -eq 2 ]; then cat << THREE ; fi
1
ONE
1
2
TWO
1
2
3
THREE
我希望输出为:
1
2
3
但是输出是
[: argument expected
我认为 $word 变量是空的。
然后我重写了程序如下,效果很好:
cat << ONE | wc -l | { read word ; if [ $word -eq 1 ]; then cat << TWO ; fi ;} | wc -l | { read word ; if [ $word -eq 2 ]; then cat << THREE ; fi ;}
1
ONE
1
2
TWO
1
2
3
THREE
输出符合预期:
1
2
3
我的问题是关于第一个片段:
- 为什么管道中的 "read word" 命令没有更新单词 shell 中的变量和后续命令无法使用 它。
- 此外,“read word”不会向标准输出写入任何内容,因此
在管道中使用它是不对的,但我想检查一下。 - 但是,"read word" 之后的命令不会读取任何内容 来自标准输入,所以应该没问题。
请记住,管道的每一侧 (|
) 都是一个单独的 shell 会话。
在您的第一次尝试中您有 ... | wc -l | read word | if ...
,因此虽然 wc -l
的结果将被读取并存储在下一个 shell 会话的变量 word
中,但此变量不会传递到下一个 shell 会话。由于变量 word
现在未定义,您的语句 if [ $word -eq 1 ]
变为 if [ -eq -1 ]
并因此出现错误。
在您的第二次尝试中,您的 { read word ; if [ $word -eq 1 ]; then cat << TWO ; fi ;}
构造表示一个单独的 shell 会话,其中变量 word
被初始化(具有 wc -l
的结果),并且因为这仍然是单个 shell 该变量现在可以在您的 if/then
块中使用。