我想创建一个数组,如下所示,以检查输出文件名是否与数组中的模式匹配。
declare -a arr=('class*_1n_*000000.txt','class*_1n_*010000.txt','class*_2n_*010000.txt','class*_2n_*012000.txt','class*_3n_*235000.txt')
if [[ "${arr[*]}"==$output_filename ]]; then
echo $output_filename exist in arr
#do something...
else
echo $output_filename not exist in arr
#do something...
fi
Run Code Online (Sandbox Code Playgroud)
我尝试过以下3种情况,评论将是我的预期结果
output_filename='class_2n_20180922012000.txt' #exist
output_filename='classA_2n_20180923012000.txt' #exist
output_filename='classA_4n_20180923012000.txt' #not exist
Run Code Online (Sandbox Code Playgroud)
但三种情况均存在返回。
我怎么解决这个问题?
任何帮助将不胜感激 :)
好的,我们首先解决几个基本的 shell 语法问题。数组声明:
declare -a arr=('class*_1n_*000000.txt','class*_1n_*010000.txt','class*_2n_*010000.txt','class*_2n_*012000.txt','class*_3n_*235000.txt')
Run Code Online (Sandbox Code Playgroud)
不起作用,因为 bash 不使用逗号来分隔数组的元素,而是使用空格。由于其中没有空格,shell 会将其视为一个大数组元素,其中恰好包含一些逗号。你要这个:
declare -a arr=('class*_1n_*000000.txt' 'class*_1n_*010000.txt' 'class*_2n_*010000.txt' 'class*_2n_*012000.txt' 'class*_3n_*235000.txt')
Run Code Online (Sandbox Code Playgroud)
二、比较:
if [[ "${arr[*]}"==$output_filename ]]; then
Run Code Online (Sandbox Code Playgroud)
根本没有做任何你想做的事。同样,空格是 shell 语法中的分隔符,并且由于它周围没有空格,因此==不被视为运算符,它只是单个长字符串的一部分。并[[ somestring ]]测试该字符串是否为非空白,并且由于该字符串不是空白,因此测试结果始终为 true。现在,明显的解决办法是:
if [[ "${arr[*]}" == $output_filename ]]; then
Run Code Online (Sandbox Code Playgroud)
...至少进行了比较,但不是您想要的比较。它将数组的整个内容(所有元素之间用空格粘在一起,因为这就是它的作用[*])视为单个字符串,并查看它是否匹配$output_filename, where$output_filename被视为通配符模式。但是您希望将数组元素视为通配符模式,因此您需要反转它:
if [[ "$output_filename" == ${arr[*]} ]]; then
Run Code Online (Sandbox Code Playgroud)
...但这仍然不是您想要的,因为它正在检查是否$output_filename匹配粘在一起的所有条目arr。为了使其匹配,$output_filename必须是五个文件名的列表,用空格分隔,第一个匹配class*_1n_*000000.txt,第二个匹配class*_1n_*010000.txt,等等。您需要将文件名与每个数组元素逐一进行比较时间,并跟踪您是否找到匹配项。像这样的东西:
found_match="false"
for pattern in "${arr[@]}"; do
if [[ "$output_filename" == $pattern ]]; then
found_match="true"
break
fi
done
if [[ "$found_match" == true ]]; then
echo "$output_filename exist in arr"
#do something...
else
echo "$output_filename not exist in arr"
#do something...
fi
Run Code Online (Sandbox Code Playgroud)
请注意"${arr[@]}"(注意双引号和@)扩展到数组的每个元素,每个元素都被视为一个单独的字符串(因此for将迭代它们)。另外,我在要打印的字符串两边加上了双引号;您几乎总是希望在变量引用(或包含变量引用的内容)周围使用双引号,以避免意外的通配符扩展等。但这里有一个例外:在 中[[ "$output_filename" == $pattern ]], 必须$pattern不加引号,因此它被视为通配符模式而不是固定字符串。
| 归档时间: |
|
| 查看次数: |
3192 次 |
| 最近记录: |