之前学习的echo和printf都是写,读使用read,格式为:

read var1 var2...

  多个参数值的读取,采用IFS。如果我们给出的值多与参数的数目,则多出来的值将都赋予最后一个承诺书,如果你不想为后续的值赋值,可以直接采 用回车来终止read的操作。在shell中read可以将pipe后的输出作为输入,赋值到某个参数中,可以逐行逐行处理文件。一般写为:

while (read a line) do
    process the line
    print the processed line
end

逐行读文件

  如果read没有读到任何,exit status为1(非0)。文件可以通过重定向方式进行输入。例如我们通过命令test来对文件file进行处理,参见Linux Bash Shell学习(十七):I/O重定向 ,可以通过:

  • ./test < file
  • cat file | ./test

  假设file每行有两个参数,我们希望逐行读,并逐行将者两个参数赋值到x,y变量中。

function wei_test0
{
        echo "Test 'Read'"

        while read x y; do
                echo "x=$x y=$y"
        #done < file 通过对允许的I/O重定向方式。
        done 
#}<file 也可以通过这种方式,在function后面通过I/O重定向进行。
}

# 请注意,这种I/O重定向方式,并不是通过$*,$1,$@,我们可以在函数中用$#来检查,为0,这几种方式用于参数输入,而不用重定 向。<file,将file作为标准输入。 下面表示subshell的重定向方式。
wei_test0 < file

cat file | wei_test0

  上面的例子中,在脚本文件里面,我们通过两种不同的重定向方式分别试验。重定向不仅可以针对命令,也可以针对脚本中的 subshell,function,语句,其优先级以最靠近read的优先。除了这三种方式外,还可以使用command block。command block是多个语句的组合,用{ },将这些语句括起来,方式和C语言一样。可以重用{… …} < file的方式。

  上面的例子可以复杂一些,在文件中,在行的前面加上#表示注释。在读的时候,我们需要忽略这些注释。

function wei_test0
{
        echo "Test 'Read' $#"

        while read x y; do
               if [ -z $(echo $x | grep '^#') ]; then
                        echo "x=$x y=$y"
                fi
        done
}

  grep的使用方法,参见Linux Bash Shell学习(十四):命令行选项

用户输入

  下面是最为常用的一种方式,给出提示信息,然后读入参数:

echo -n 'Input you value here: '
read my_value

  如果我们希望提示符不显示在strout,而是现实在stderr,可以在echo –n ‘….’ > &2,将输出详细文件描述符2,即stderr。

Read的一些选项

 Read可以带有-a, -d, -e, -n, -p, -r, -t, 和 -s八个选项。

-a :将内容读入到数值中

echo -n "Input muliple values into an array:"
read -a array
echo "get ${#array[@]} values in array"

-d :表示delimiter,即定界符,一般情况下是以IFS为参数的间隔,但是通过-d,我们可以定义一直读到出现执行的字符位置。例如read –d madfds value,读到有m的字符的时候就不在继续向后读,例如输入为 hello m,有效值为“hello”,请注意m前面的空格等会被删除。这种方式可以输入多个字符串,例如定义“.”作为结符号等等。

-e :只用于互相交互的脚本,它将readline用于收集输入行。读到这几句话不太明白什么意思,先跳过。

-n :用于限定最多可以有多少字符可以作为有效读入。例如echo –n 4 value1 value2,如果我们试图输入12 34,则只有前面有效的12 3,作为输入,实际上在你输入第4个字符‘3’后,就自动结束输入。这里结果是value为12,value2为3。

-p :用于给出提示符,在前面的例子中我们使用了echo –n “…“来给出提示符,可以使用read –p ‘… my promt?’value的方式只需一个语句来表示。

-r :在参数输入中,我们可以使用’\’表示没有输入完,换行继续输入,如果我们需要行最后的’\’作为有效的字符,可以通过-r来进行。此外在输入字符中, 我们希望\n这类特殊字符生效,也应采用-r选项。

-s :对于一些特殊的符号,例如箭头号,不将他们在terminal上打印,例如read –s key,我们按光标,在回车之后,如果我们要求显示,即echo,光标向上,如果不使用-s,在输入的时候,输入处显示^[[A,即在terminal上 打印,之后如果要求echo,光标会上移。

-t :用于表示等待输入的时间,单位为秒,等待时间超过,将继续执行后面的脚本,注意不作为null输入,参数将保留原有的值。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注