options
다음과 같은 단순화된 코드를 사용하여 배열의 항목이 파일에 있는지 확인하려고 합니다 .$file
options=(
A
B
C
)
for i in "${options[@]}"; do
if grep -F $file "${i}" = false; then
echo "${i}"
fi
done
나는 이것이 A, B 또는 C(존재하지 않는 경우)를 출력할 것으로 예상했지만 $file
A, B 및 C를 출력합니다.
grep: A: No such file or directory
grep: =: No such file or directory
grep: false: No such file or directory
이를 통해 grep은 모든 인수를 확인하거나 확인할 파일로 해석하는 것으로 보이며 이는 if 문에 부울 값에 대한 올바른 구문이 없음을 의미합니다. 그래서 내 질문은 두 가지입니다.
- grep이나 다른 명령을 사용하여 배열의 요소가 에 있는지 확인하려면 어떻게 해야 합니까
$file
? - 이 명령이 부울 값을 if 문의 일부로 유지하는 대신 매개변수로 해석하지 못하도록 하려면 어떻게 해야 합니까?
답변1
- 를 포함한 모든 변수 확장을 인용합니다
$file
. - "부울"을 확인하면 안됩니다. 껍질에는 그런 것이 없습니다. 의미하는 바는 grep의 종료 코드를 확인하는 것입니다. 일치하는 줄이 없으면 1이고 줄이 일치하면 0입니다(에서 찾을 수 있음
man grep
). - grep 매개변수의 순서를 확인하세요. 먼저 모드, 그다음 파일 이름입니다.
options
그러면 파일에 없는 배열의 모든 요소가 에코됩니다 .
options=(
A
B
C
)
for i in "${options[@]}"; do
if ! grep -qF "$i" "$file"; then
echo "$i"
fi
done
-q
표준 출력으로 전송될 grep과 일치하는 행을 억제하는 플래그를 grep에 추가했습니다 .
답변2
Usage: grep [OPTION]... PATTERN [FILE]...
Search for PATTERN in each FILE.
Example: grep -i 'hello world' menu.h main.c
-q, --quiet, --silent suppress all normal output
options=(
A
B
C
)
for i in "${options[@]}"; do
if grep -q "${i}" $file; then
echo "${i}" # ${i##*/} is a parametr expansion
#it removes left side of string till last slash
fi
done