인터넷에서 관련 게시물을 많이 보았지만 원하는 방식으로 작동하도록 할 수 없습니다.
경로 사용자로부터 입력을 받았습니다. 예를 들어 사용자가 ~/Desktop/을 입력하면 물결표 때문에 grep 및 기타 명령에 $ans를 사용할 수 없습니다.
다음은 내 코드의 예입니다. 두 번째 줄이 지금 내 주요 문제입니다.
read -p "Enter new path or type 'exit': " ans
file=`grep -x $ans ~/.Log`
도움을 주셔서 감사합니다.
답변1
여기에는 몇 가지 질문이 있습니다.
변수에 대한 참조가 없습니다. 이는 사용자가 전달하는 모든 항목이 (매개변수 확장 후) 공백에 대한 토큰화의 적용을 받는다는 것을 의미합니다.그리고글로벌 확장. 이것은 문제를 일으킬 것입니다. 바라보다:
사용자 입력은 하이픈으로 시작할 수 있습니다. 그렇다면 옵션으로 해석됩니다
grep
. 이를 방지하려면 이 옵션을 사용하여 매개변수에 검색 패턴(어떤 형태이든)을 구체적으로-e
알려주세요 .grep
정규식 검색을 사용하고 있습니다. 정규식 대신 고정 텍스트 검색을 원할 수도 있습니다. 따라서
-F
.백틱은 더 이상 사용되지 않습니다. 대신 사용하시기 바랍니다
$(...)
. 또한보십시오:
이러한 점을 종합하면 다음과 같은 코드가 생성됩니다.
read -p "Enter new path or type 'exit': " ans
file="$(grep -Fxe "$ans" ~/.Log)"
하지만 이제 다른 문제가 생겼습니다.
이 변수에는
file
다음만 포함됩니다.정확히어쨌든, 사용자가 입력하는 것. 아니면 아무것도 포함되어 있지 않을 수도 있습니다. 또는 사용자가 입력한 내용의 여러 복사본이 줄바꿈으로 구분되어 포함될 수도 있습니다.추가한 플래그를 생략하면
-F
변수에는file
사용자가 입력한 정규식과 일치하는 전체 줄만 포함됩니다.이 중 어느 것도 피할 수 없는 일은 아니다문서. 해당 변수의 이름을 지정했다는 사실은
file
코드가 실제로 수행하는 작업보다 수행할 작업에 대해 다른 기대를 갖고 있음을 암시합니다.스크립트에 중요하지 않은 사용법과 관련된 잠재적인 문제도 많이 있지만
read
최소한 다음을 참조해야 합니다.(해당 기사에서는 쉘 사용에 대해 설명하고 있지만반지(당신이 하지 않은) 텍스트를 조작하면서 사용법과 관련된 몇 가지 단점을 좋은 예와 함께 설명합니다
read
. )file
또한 나중에 해당 변수로 무엇을 하든 아마도많은파이프를 통해 더 간단하게 수행됩니다.
하지만 스크립트의 나머지 부분이 어떻게 생겼는지 모르기 때문에 이에 대해 더 이상 논의할 수 없습니다.
답변2
참조 패키지 검색 변수
파일=`grep -x "$ans" ~/.Log`
답변3
바라보다이 문제그리고 거기에 답이 있습니다. 이는 쉘 확장, 특히 물결표 확장의 순서 및 인용과 관련이 있습니다. 제가 대답하는 가장 쉬운 방법은 의 ~
값을 검색하여 바꾸는 것입니다 $HOME
. 따라서 grep 앞에 다음 줄을 추가할 수 있습니다.
ans="${ans//\~/$HOME}"
bashism이지만 bash라고 표시되어 있습니다.