패턴이 일치하는 줄 앞에 문자 추가

패턴이 일치하는 줄 앞에 문자 추가

다음을 포함하는 배열이 있습니다.

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"]]

(후자는 단어로 해석되며 쉘은 해당 이름을 가진 명령을 찾으려고 시도합니다.)

또한 ${!array[@]}배열의 인덱스가 제공됩니다. 스크립트에서 index 를 인쇄했기 때문에 이것이 원하는 것인지 확실하지 않지만 echo $i예제 출력에는 배열에 저장된 문자열이 포함된 것 같습니다. 특별한 인덱스가 필요하지 않은 경우에는 for value in "${array[@]}".

그런 다음 패턴의 일부를 일치시키려면 패턴 앞과 뒤의 모든 항목을 허용해야 함을 쉘에 명시적으로 알려야 합니다( [[ "$var" = *$pattern* ]]패턴 주위에 따옴표가 없음). (바라보다여기)

그래서 조금 설명하자면 다음과 같습니다.

A=("abc" "def" "ghi")
pat=e
for val in "${A[@]}"; do 
    [[ "$val" = *$pat* ]] && echo -n "~"
    echo "$val"
done

인쇄

abc
~def
ghi

관련 정보