比较包含长字符串和简单 txt 文件的单个数组元素



我知道,这应该是相当微不足道的,但我不知道为什么我被卡住了。问题:一个简单的/file.txt

aaa bbb
ccc ddd

应根据字符串数组进行检查

declare -a strings
strings[0]="aaa bbb"
strings[1]="$strings[0]"
strings[1]+="ccc ddd"

在一个简单的函数中

status "$path_to_file" "${strings[@]}"

和这样的定义。

function status {
local conf=$1
shift
local statuses=("$@")
local len="${#statuses[@]}"
for ((i=0; i<len; i++)); do
if [[ "$(< "$conf")" == "${statuses[${i}]}" ]]; then
logger "$0 status success"
return $i
fi
#echo "${statuses[${i}]}"
done
logger "$0 status fail"
return `expr $len - 1`
}

这条线if [[ "$(< "$conf")" == "${statuses[${i}]}" ]]; then困扰着我。它不像字符串那样扩展,而是像

aaa bbb
ccc ddd

用反斜杠扩展字符串无法==进行比较。为什么?

我不确定为什么扩展显示反斜杠,但是,这不是您的问题。

这里的问题是"$(< "$conf")"将返回文件中的所有数据,因此"if"中的两个字符串本质上是不同的。

您可以检查以下脚本是否返回成功,尽管仍然通过 bash -x 显示可怕的"\a\a\a"。

#!/bin/bash -x 
function status {
local conf=$1
shift
local statuses=("$@")
echo $statuses
local len="${#statuses[@]}"
for ((i=0; i<len; i++)); do
if [[ $(head -n `expr $i + 1` $conf | tail -n 1) == "${statuses[$i]}" ]]; then
logger "$0 status success"
return $i
fi
#echo "${statuses[${i}]}"
done
logger "$0 status fail"
return `expr $len - 1`
}
declare -a strings
strings[0]="aaa bbb"
strings[1]="$strings"
strings[1]+=" ccc ddd"
path_to_file=./data
status "$path_to_file" "${strings[@]}"

当 ./data 是包含以下内容的文件时:

aaa bbb
ccc ddd

最新更新