如何在bash中标记字符串并在每个标记上调用函数?

问题描述 投票:1回答:2

我有一个带有逗号分隔符的文本文件,如下所示

例如str_data.txt

aaa,111,bbb
ccc,222,ddd
eee,333,fff

我有一个bash函数来验证每个令牌(即,如果每个令牌都遵循某个规则或不基于该函数,则将返回true或false。(也可以使其像[[XYZ ==“ $ 1”]]一样)代替返回回波))

例如

function validate_token {
  local _rule = XYZ
  if [[ XYZ == "$1" ]]; then
    echo "true"
  else
    echo "false"
  fi
}

我想编写一个bash脚本(单行或多行)来分别验证所有这些令牌(即validate_token“ aaa”然后validate_token“ 111”),最后根据AND的结果回答“ true”或“ false”每个令牌的结果。

bash shell scripting
2个回答
0
投票

您可以尝试以下操作,逐行读取并将值存储到数组中,然后迭代该数组,为每个值调用函数:

IFS=","
while read line
do 
   read -ra lineValues <<< "$line"
   for value in "${lineValues[@]}"
   do 
      validate_token "$value" 
   done
done < your_txt_file

0
投票

请您尝试以下操作:

validate_token() {
    local rule="???"    # matches a three-chraracter string
    if [[ $1 == $rule ]]; then
        echo 1
    else
        echo 0
    fi
}

final=1                 # final result
while IFS=, read -ra ary; do
    for i in "${ary[@]}"; do
        final=$(( final & $(validate_token "$i") ))
        # take AND with the individual test result
    done
done < "str_data.txt"

(( $final )) && echo "true" || echo "false"

由于多种原因,我还修改了您的功能。

  • [定义bash函数时,首选name() { .. }形式。
  • 不建议在用户的变量名下加下划线。您已经local化了它,不必关心变量名碰撞。
  • [使用===运算符评估条件表达式时在[[ .. ]]中,最好将patternrule放置在运算符。
  • 返回10而不是truefalse进行进一步的计算很方便。

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.