Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 试着写<<<&引用;以ksh为单位_Unix_Ksh - Fatal编程技术网

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
不同,最后一个命令在同一进程中运行,这意味着