Unix 试着写<<<&引用;以ksh为单位
我遇到以下代码问题:Unix 试着写<<<&引用;以ksh为单位,unix,ksh,Unix,Ksh,我遇到以下代码问题: IFS=: read c1 c2 c3 c4 rest <<< "$line" 好的,所以除了 echo -e "Last Name: $c1\nFirst Name: $c2\nState: $state" 它只会显示: 姓氏: 名字: 声明: 所以我可以看到它没有正确地添加到我的回音中 最终编辑 代码: 狂欢节 除了后者使用管道这一明显的例外,这意味着您不能特别有意义地将其与read一起使用。一种常见的解决方法是使用setbuiltin从字符串或
IFS=: read c1 c2 c3 c4 rest <<< "$line"
好的,所以除了
echo -e "Last Name: $c1\nFirst Name: $c2\nState: $state"
它只会显示:
姓氏:
名字:
声明:
所以我可以看到它没有正确地添加到我的回音中
最终编辑
代码:
狂欢节
除了后者使用管道这一明显的例外,这意味着您不能特别有意义地将其与read
一起使用。一种常见的解决方法是使用set
builtin从字符串或外部命令捕获令牌:
oldIFS=$IFS
IFS=:
set -- $line # no quotes
IFS=$oldIFS
c1=$1
c2=$2
c3=$3
c4=$4
shift; shift; shift; shift
rest="$*" # loses spacing / quoting
另一个解决方法是使用一个只迭代一次的循环;一开始这可能看起来很优雅,但如果伪循环的主体很长或很复杂,则可能会导致相当笨拙的代码
echo "$line" |
while IFS=: read c1 c2 c3 c4 rest; do
: stuff which uses those variables
done
这解决了以下问题:echo stuff | read variable
将在子进程中运行read
,从而立即忘记variable
的值-的主体,而循环与read
发生的过程完全相同,因此,它初始化的变量的值在循环中是可见的
另一个类似的解决方法是将读取和处理委托给函数
process () {
IFS=: read c1 c2 c3 c4 rest
: stuff which uses those variables
}
echo "$line" | process
这是笨拙还是优雅很大程度上取决于函数中发生了什么。如果它被整齐地封装起来,它可能会相当吸引人;但是,如果您最终传入了一组不相关的变量(或者更糟糕的是,在函数中修改全局变量!),情况可能恰恰相反
除了后者使用管道这一明显的例外,这意味着您不能特别有意义地将其与read
一起使用。一种常见的解决方法是使用set
builtin从字符串或外部命令捕获令牌:
oldIFS=$IFS
IFS=:
set -- $line # no quotes
IFS=$oldIFS
c1=$1
c2=$2
c3=$3
c4=$4
shift; shift; shift; shift
rest="$*" # loses spacing / quoting
另一个解决方法是使用一个只迭代一次的循环;一开始这可能看起来很优雅,但如果伪循环的主体很长或很复杂,则可能会导致相当笨拙的代码
echo "$line" |
while IFS=: read c1 c2 c3 c4 rest; do
: stuff which uses those variables
done
这解决了以下问题:echo stuff | read variable
将在子进程中运行read
,从而立即忘记variable
的值-的主体,而循环与read
发生的过程完全相同,因此,它初始化的变量的值在循环中是可见的
另一个类似的解决方法是将读取和处理委托给函数
process () {
IFS=: read c1 c2 c3 c4 rest
: stuff which uses those variables
}
echo "$line" | process
这是笨拙还是优雅很大程度上取决于函数中发生了什么。如果它被整齐地封装起来,它可能会相当吸引人;但是,如果您最终传入了一组不相关的变量(或者更糟糕的是,在函数中修改全局变量!),情况可能恰恰相反
除了后者使用管道这一明显的例外,这意味着您不能特别有意义地将其与read
一起使用。一种常见的解决方法是使用set
builtin从字符串或外部命令捕获令牌:
oldIFS=$IFS
IFS=:
set -- $line # no quotes
IFS=$oldIFS
c1=$1
c2=$2
c3=$3
c4=$4
shift; shift; shift; shift
rest="$*" # loses spacing / quoting
另一个解决方法是使用一个只迭代一次的循环;一开始这可能看起来很优雅,但如果伪循环的主体很长或很复杂,则可能会导致相当笨拙的代码
echo "$line" |
while IFS=: read c1 c2 c3 c4 rest; do
: stuff which uses those variables
done
这解决了以下问题:echo stuff | read variable
将在子进程中运行read
,从而立即忘记variable
的值-的主体,而循环与read
发生的过程完全相同,因此,它初始化的变量的值在循环中是可见的
另一个类似的解决方法是将读取和处理委托给函数
process () {
IFS=: read c1 c2 c3 c4 rest
: stuff which uses those variables
}
echo "$line" | process
这是笨拙还是优雅很大程度上取决于函数中发生了什么。如果它被整齐地封装起来,它可能会相当吸引人;但是,如果您最终传入了一组不相关的变量(或者更糟糕的是,在函数中修改全局变量!),情况可能恰恰相反
除了后者使用管道这一明显的例外,这意味着您不能特别有意义地将其与read
一起使用。一种常见的解决方法是使用set
builtin从字符串或外部命令捕获令牌:
oldIFS=$IFS
IFS=:
set -- $line # no quotes
IFS=$oldIFS
c1=$1
c2=$2
c3=$3
c4=$4
shift; shift; shift; shift
rest="$*" # loses spacing / quoting
另一个解决方法是使用一个只迭代一次的循环;一开始这可能看起来很优雅,但如果伪循环的主体很长或很复杂,则可能会导致相当笨拙的代码
echo "$line" |
while IFS=: read c1 c2 c3 c4 rest; do
: stuff which uses those variables
done
这解决了以下问题:echo stuff | read variable
将在子进程中运行read
,从而立即忘记variable
的值-的主体,而循环与read
发生的过程完全相同,因此,它初始化的变量的值在循环中是可见的
另一个类似的解决方法是将读取和处理委托给函数
process () {
IFS=: read c1 c2 c3 c4 rest
: stuff which uses those variables
}
echo "$line" | process
这是笨拙还是优雅很大程度上取决于函数中发生了什么。如果它被整齐地封装起来,它可能会相当吸引人;但是,如果你最终传入了一堆不相关的变量(或者更糟糕的是,在函数中修改全局变量!),情况可能恰恰相反。相关:相关:相关:相关:函数确实看起来非常优雅且经过深思熟虑。在未来的项目中,我可能会使用类似的东西。然而,我参加的课程更多的是学习UNIX的基础知识。我知道这会让执行任务变得更加困难。我最终使用了while循环。我将编辑我的帖子并展示代码的最终外观。感谢“[…]但明显的例外是后者使用管道,这意味着您无法将其与read一起有意义地使用。”。这不一定是真的,问题不在于管道本身,而在于特定shell如何实现管道(另请参见)。。。。。。在ksh
中,与bash
不同,最后一个命令在同一进程中运行,这意味着