백틱을 사용하여 변수 값에 필터 적용

백틱을 사용하여 변수 값에 필터 적용

이렇게 간단한 질문을 해서 죄송합니다. 하지만 인터넷에서 이 문제에 대해 읽어본 결과 아무 소용이 없는 것으로 나타났습니다. 나는 무덤/백틱 연산자를 더 잘 이해하려고 노력하고 있으며 지금까지 한 번을 제외하고는 꽤 좋은 일을 해왔습니다.

bash 스크립트와 그 안에 다음과 같은 변수가 있다고 가정해 보겠습니다.

var=`ls -al | grep '^...x'

이제 스크립트는 사용자에게 몇 가지 입력을 요청하고 해당 내용을 기반으로 결과를 출력합니다. 따라서 전체 대본으로 인해 지루해지지 않도록 한 가지 질문으로 요약하고 싶습니다. 사용자가 "-t"를 인수로 입력하면 스크립트는 사용자가 실행할 수 있는 모든 .txt 파일을 인쇄해야 합니다. 예:

$var | grep '\.txt$'

이제 var의 값을 다시 할당하려고 하면 문제가 발생합니다. 나는 이것을 시도한다:

var=`$var | grep '\.txt$'`

그러나 이것은 작동하지 않습니다. 여기서 무엇을 놓치고 있는지 잘 모르겠습니다. 이 문제를 처리하는 올바른 방법은 무엇입니까?

답변1

명령을 실행하려면 백틱 연산자를 사용하지 말아야 합니다. 다음을 사용하는 것만큼 이식성이 낮습니다.

$ my_var=$(ls -la | grep '^...x')

문제에 관해 시도해 보십시오.

$ var=$(echo $var | grep '\.txt$')

답변2

백틱 안의 내용(명령 대체btw)는 실행할 명령입니다. 당신이 글을 쓸 때

$var | grep '\.txt$'

그러면 값이 var명령으로 실행됩니다. 이는 원하는 것이 아닙니다. grep값을 명령에 입력으로 전달하려고 합니다. 기본적으로 그게 다야

echo "$var" | grep '\.txt$'

그래서 과제는

var=`echo "$var" | grep '\.txt$'`

인용 규칙, 특히 중첩 대체를 이해하기 쉽기 때문에 백틱 대신 달러 괄호 구문을 사용하는 것이 좋습니다. $(확장으로 시작하는 명령은 일치하는 것으로 대체됩니다 ).

var="$(echo "$var" | grep '\.txt$')"

주변의 큰따옴표에 유의하세요 $var. 이 구문은 큰따옴표 안의 $var"" 값만 나타내므로 var더 복잡합니다. 바라보다공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?더 많은 정보를 알고 싶습니다.

조심하세요구문 분석된 출력은 ls일반적으로 나쁜 생각입니다.. 일부 파일 이름이 손상될 수 있으며 가장 쉬운 방법은 아닙니다. 파일 만 나열하려면 .txt와일드카드 패턴을 사용하면 됩니다 *.txt( 와 달리 도트 파일은 포함되지 않습니다. 도트 ls -al파일을 포함하려면 패턴을 추가하세요 .*.txt). 실행 파일만 고려하려는 경우 신뢰할 수 있는 접근 방식은 실행 파일을 루프에서 처리하는 것입니다.

for x in *.txt; do
  if [ -x "$x" ]; then
    … do stuff
  fi
done

관련 정보