
아래와 같이 변수에서 문자열의 일부를 추출하고 싶지만 잘못된 대체를 반환합니다.
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`가 구문 분석되지 않는 이유는 무엇입니까(대신 무엇을 해야 할까요)?