파일에 bash에 특정 문자열이 포함되어 있는지 확인하고 싶습니다. 이 스크립트를 사용했지만 작동하지 않습니다.
if [[ 'grep 'SomeString' $File' ]];then
# Some Actions
fi
내 코드에 어떤 문제가 있습니까?
command
: stackoverflow.com/questions/12375722/...
파일에 bash에 특정 문자열이 포함되어 있는지 확인하고 싶습니다. 이 스크립트를 사용했지만 작동하지 않습니다.
if [[ 'grep 'SomeString' $File' ]];then
# Some Actions
fi
내 코드에 어떤 문제가 있습니까?
command
: stackoverflow.com/questions/12375722/...
답변:
if grep -q SomeString "$File"; then
Some Actions # SomeString was found
fi
당신은 [[ ]]
여기에 필요하지 않습니다 . 명령을 직접 실행하십시오. -q
문자열을 찾을 때 표시 될 필요가없는 경우 옵션을 추가하십시오 .
grep
명령은 검색 결과에 따라 종료 코드 0 또는 1을 반환합니다. 무언가가 발견되면 0; 그렇지 않으면 1입니다.
$ echo hello | grep hi ; echo $?
1
$ echo hello | grep he ; echo $?
hello
0
$ echo hello | grep -q he ; echo $?
0
의 조건으로 명령을 지정할 수 있습니다 if
. 명령이 종료 코드에서 0을 리턴하면 조건이 true임을 의미합니다. 그렇지 않으면 거짓.
$ if /bin/true; then echo that is true; fi
that is true
$ if /bin/false; then echo that is true; fi
$
보시다시피 여기에서 프로그램을 직접 실행하십시오. 추가 []
또는 없음 [[]]
.
grep
asnwer stackoverflow.com/a/4749368/1702557
-m 1
스캔 성능을 향상 시키려면 사용 을 고려하십시오 . 처음 발생했을 때 반환합니다.
SomeString
정규 표현식 특수 문자 가 포함 된 경우 (예 :) .
예기치 않은 결과가 발생할 수 있습니다. 항상 fgrep
(또는 grep -F
)를 사용하는 것이 더 안전합니다 ( 정말로 정규 표현식이 필요한 경우가 egrep
아니면 (또는 grep -E
)가 최선의 선택 일 것입니다)
if
코드는 종료 코드가 0이 아닌지 확인하기 때문에 올바르지 않습니다. 파일을 읽을 수없는 것처럼 오류가 발생하면 종료 코드도 0이 아닙니다. 따라서와 같은 작업을 수행하고 (발견 된) ec=$?
확인하고 0
(발견 1
되지 않은) 확인하고 다른 것이 있는지 (실패) 확인하십시오.
원하는 것을 수행하는 방법을 알려주는 다른 답변 외에도 잘못된 것이 무엇인지 설명하려고합니다.
Bash에서 if
명령을 따릅니다. 이 명령의 종료 코드가 0이면 then
부품이 실행되고 그렇지 않으면else
부품이 실행됩니다.
다른 답변에서 설명한대로 모든 명령 으로이 작업을 수행 할 수 있습니다. if /bin/true; then ...; fi
[[
파일 존재, 변수 비교와 같은 일부 테스트 전용 내부 bash 명령입니다. 마찬가지로 거의 동일한 테스트를 수행하지만 최종 인수로 필요한 [
외부 명령 (일반적으로에 위치 함 /usr/bin/[
)이 왼쪽에 공백으로 채워져 있어야합니다.]
]
]]
.
여기 필요 [[
도 없습니다[
.
또 다른 것은 물건을 인용하는 방법입니다. bash에는 따옴표 쌍이 중첩되는 경우가 하나뿐입니다 "$(command "argument")"
. 그러나 인용 된 단위 'grep 'SomeString' $File'
이기 때문에 하나의 단어 만 있습니다.이 'grep '
단위는에 연결 SomeString
되고 다시 연결됩니다 ' $File'
. $File
작은 따옴표를 사용하기 때문에 변수 는 값으로 대체되지 않습니다. 올바른 방법은 grep 'SomeString' "$File"
입니다.
##To check for a particular string in a file
cd PATH_TO_YOUR_DIRECTORY #Changing directory to your working directory
File=YOUR_FILENAME
if grep -q STRING_YOU_ARE_CHECKING_FOR "$File"; ##note the space after the string you are searching for
then
echo "Hooray!!It's available"
else
echo "Oops!!Not available"
fi
가장 짧은 (올바른) 버전 :
grep -q "something" file; [ $? -eq 0 ] && echo "yes" || echo "no"
로 쓸 수도 있습니다
grep -q "something" file; test $? -eq 0 && echo "yes" || echo "no"
그러나이 경우 명시 적으로 테스트 할 필요가 없으므로 다음과 동일합니다.
grep -q "something" file && echo "yes" || echo "no"
if grep -q something file; then echo yes; else echo no; fi
. 전혀 혼란스러워 할 이유가 없습니다 $?
.
문자열이 전체 줄과 일치하는지 확인하고 고정 문자열 인 경우 다음과 같이 할 수 있습니다
grep -Fxq [String] [filePath]
예
searchString="Hello World"
file="./test.log"
if grep -Fxq "$searchString" $file
then
echo "String found in $file"
else
echo "String not found in $file"
fi
man 파일에서 :
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by newlines, any of
which is to be matched.
(-F is specified by POSIX.)
-x, --line-regexp
Select only those matches that exactly match the whole line. (-x is specified by
POSIX.)
-q, --quiet, --silent
Quiet; do not write anything to standard output. Exit immediately with zero
status if any match is
found, even if an error was detected. Also see the -s or --no-messages
option. (-q is specified by
POSIX.)
grep -q "something" file
[[ !? -eq 0 ]] && echo "yes" || echo "no"
$?
뿐만 아니라 전혀 필요하지 않습니다. 당신은 할 수 있습니다if grep -q ...
foo && truthy_action || falsey_action
실제 삼항 연산자가 아닙니다. truthy_action
실패하면 추가로falsey_action
실행 됩니다 .
if
명령을 실행하고 종료 코드를 확인하는 것입니다. $?
명시 적으로 검사 할 필요는 거의 없습니다 .