我知道,这应该是相当微不足道的,但我不知道为什么我被卡住了。问题:一个简单的/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