변수 참조에서 파이프를 사용하는 방법은 무엇입니까?

변수 참조에서 파이프를 사용하는 방법은 무엇입니까?

아래와 같이 변수에서 문자열의 일부를 추출하고 싶지만 잘못된 대체를 반환합니다.

for i in `ls`;do echo ${i|cut -d. -f1};done

-bash: ${i|cut -d. -f1}: bad substitution

내 시나리오에서는 파일 배치의 접미사 이름을 바꾸고 싶습니다.
예를 들면 다음 abc.txt과 같습니다.abc.csv

그렇다면 올바른 구문으로 무엇을 할 수 있습니까?

${i}그런데, 이 형식을 무엇이라고 부르는지 모르겠습니다 .

답변1

현재 디렉터리에서 사용 가능한 이름의 첫 번째 점 뒤의 모든 항목을 삭제하려는 것 같습니다.

현재 디렉토리의 모든 이름을 반복하려면 다음을 사용하십시오.

for name in *; do ...; done

육안 검사 이외의 목적 으로 출력을 사용하는 것은 ls오류가 발생하기 쉬우므로 피해야 합니다. 바라보다`ls`가 구문 분석되지 않는 이유는 무엇입니까(대신 무엇을 해야 할까요)?

$name첫 번째 포인트 (포인트 자체 포함) 뒤의 비트를 제거하려면 ${name%%.*}다음을 사용하십시오.표준 매개변수 확장.*변수 값에서 와일드카드 패턴과 일치하는 가장 긴 접미사를 제거합니다 name.

이 확장의 결과를 출력하려면 다음을 사용할 수 있습니다.

printf '%s\n' "${name%%.*}"

둘 다 보기언제 큰따옴표가 필요합니까?그리고왜 printf가 echo보다 나은가요?.

전체 스크립트는 다음과 같이 작성할 수 있습니다.

#!/bin/sh

for name in *; do
    printf '%s\n' "${name%%.*}"
done

이름에 대한 두 번째 질문은 ${i}변수 확장입니다(때때로 "매개변수 확장" 또는 "변수/매개변수 대체"라는 용어를 사용함). ${i}변수 값으로 확장 /대체합니다 i. $i여기서는 특별한 작업을 수행하지 않고 중괄호 로 작성할 수도 있습니다 . 사용할 수 있는 유일한 위치 ${i}$i확장이 문자열의 일부이고 다음 문자가 변수 이름에 유효한 경우입니다 "${i}_stuff"( $i_stuff변수 확장을 시도합니다 i_stuff).

답변2

당신은 그것을 사용할 수 있습니다 ${i%%.*}. 점이 처음 발생한 이후의 모든 항목(점 포함)을 삭제합니다.

예를 들어

i=absdfsfd.b.c.dddd
echo "${i%%.*}"

출력을 줄 것이다

absdfsfd

귀하의 경우:

 for i in *;do echo "${i%%.*}";done

그런 다음 사용하지 마십시오 for i in ls. 바라보다`ls`가 구문 분석되지 않는 이유는 무엇입니까(대신 무엇을 해야 할까요)?

관련 정보