在具有匹配模式的行之前添加一个字符

在具有匹配模式的行之前添加一个字符

我有一个数组,其中包含

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

相关内容