如何在bash中向一个函数发送一行?

时间:2017-11-12 01:10:37

标签: bash

我在bash中写了这个函数,当我测试它只是打印一个空行时它没有给我任何东西,所以我认为我的问题是我实际运行函数的方式,以及如何给它一行。 - >函数接受一个单词格式的行,并在每个单词之间接受一个空格,现在该行以一个包含5个字母的单词结束,例如:

  

"狗猫777A"

或以字母结尾后的0-100之间的数字结束:

  

"狗猫777A 88"

现在该函数接受该行,并且应该打印0-100之间的数字,但如果该数字不存在,则该函数应该打印" - "代替。

这是函数

function get { 
  local num_words=`echo "$1" | wc -w`      
  let num_words--
  echo "$1" | while read -a line ; do
  while (( num_words > 0 )) ; do
   number_letters=`echo ${line[$num_words]} | wc -c`
   let number_letters--
   if (( number_letters < 4 )) ; then
   echo "${line[$num_words]}"
   break
   fi
   echo -
   break
   let num_words--
 done
 break
 done
}

这就是我测试它的方式:

 line="444444 wefd sfdggag 987f 98"
result="`echo "$line" | get`"
echo $result

当我运行该函数时,我得到一个空行。

2 个答案:

答案 0 :(得分:0)

问题出在你测试时。你应该写:

#!/bin/sh
function get { 
  local num_words=`echo "$1" | wc -w`      
  let num_words--
  echo "$1" | while read -a line ; do
  while (( num_words > 0 )) ; do
   number_letters=`echo ${line[$num_words]} | wc -c`
   let number_letters--
   if (( number_letters < 4 )) ; then
   echo "${line[$num_words]}"
   break
   fi
   echo -
   break
   let num_words--
 done
 break
 done
}

line="444444 wefd sfdggag 987f 98"
#result="`echo "$line" | get`"
result="`get "$line"`"
echo $result
line="cat cats dog 1217A"
result="`get "$line"`"
echo $result

答案 1 :(得分:0)

在函数内部,可以从$ 1,$ 2等检索参数。调用函数时,它们应该遵循其名称:

my_func () {
    echo "Argument 1: $1"
    echo "Argument 2: $2"
}
my_func arg1 arg2

如果希望函数处理标准输入,请不要使用参数。将它传递给函数。在功能内部,只需处理输入 - 可以通过read读取,也可以按grep或其他任何方式对其进行过滤。

my_func () {
    let i=1
    while read line ; do
        echo $((i++)) "$line"
    done
}
ls | my_func