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