我有一个数组,其中包含
line number 1
line number 2
line number 3
line number 4
line number 5
然后我要求用户输入:
read userInput
echo $userInput
然后我尝试匹配用户输入,这是我的数组的一个数字
for i in "${!array[@]}";do
if [["${array[$i]}"="$userInput"]]
then
echo "~"
echo " $i"
fi
done
但这行不通。期望的输出是这样的:
4
line number 1
line number 2
line number 3
~line number 4
line number 5
有人可以帮我吗?
答案1
条件[[ .. ]]
需要运算符和值周围有空格,即
[[ "${array[$i]}" = "$userInput" ]]
instead of
[["${array[$i]}"="$userInput"]]
(后者被解释为一个单词,并且 shell 尝试查找具有该名称的命令。)
另外,还${!array[@]}
为您提供数组的索引。我不确定这是否是您想要的,因为在脚本中您用 打印出索引echo $i
,但您的示例输出似乎包含存储在数组中的字符串。如果不需要特别的索引,您可以只使用for value in "${array[@]}"
.
然后,如果您想匹配部分模式,则需要明确告诉 shell 应该接受模式之前和之后的任何内容:([[ "$var" = *$pattern* ]]
模式周围没有引号)。 (看这里)
所以,稍微解释一下:
A=("abc" "def" "ghi")
pat=e
for val in "${A[@]}"; do
[[ "$val" = *$pat* ]] && echo -n "~"
echo "$val"
done
印刷
abc
~def
ghi