2012-10-11 2 views
7

인수의 기본 이름을 사용하는 스크립트를 작성하려고합니다. 그런 다음 인수에 확장이 있는지 확인합니다. 있는 경우 확장자를 인쇄합니다. 내가베이스 이름의 출력이 무엇인지 확인하기 위해 최종 $의 기본 이름을 $ 1 반향있어Bash 기본 이름 구문

file=basename $1 
ext=${file%*} 
echo ${file#"$stub"} 
echo $basename $1 

:

여기 내 코드입니다.

일부 테스트는 공개 :

testfile.sh one.two 
./testfile: line 2: one.two: command not found 
one.two 

testfile.sh ../tester 
./testfile: line 2: ../tester: No such file or directory 
../tester 

그래서 어느 $의 기본 이름 $ 대략 1있다. 나는 문법 오류라는 것을 알고 누군가 내가 잘못하고있는 것을 설명 할 수 있을까?

편집 :와 지금 내 문제를 해결했습니다

:

베이스 명 내 주장을 감소
file=$(basename "$1") 
stub=${file%.*} 
echo ${file#"$stub"} 

는, 모두 감사합니다.

+0

정확한 구문은 file = $ (basename $ 1)입니다. file = $ {1 ## * /}을 사용하면 모든 '* /'시퀀스가 제거됩니다. 실제로 루프에서 파일을 처리 할 때 basename 명령보다 훨씬 빠릅니다. –

답변

12

먼저, 구문은 잘못된 것입니다 : 당신이 변수에 할당 할 경우

ext=${file##*.} 
+0

첫 번째 부분을 보내 주셔서 감사합니다. 이제 파일이 basename의 출력과 동일하므로 도움이됩니다.이제 내 프로그램이 의도 한대로 작동하지 않습니다. 즉, 초기 인수가 tester.two 인 경우 .two 대신 tester.two를 출력하는 것입니다. 내가 basename을 추가하기 전에, 내 스크립트는 아무것도 테스트하지 않았을 때부터 의도적으로 출력을 출력하고있었습니다. – Unknown

8

:

file=$(basename "$1") 

둘째,이 파일 이름의 (마지막) 확장을 얻을 수있는 올바른 표현이다 명령의 결과를 보려면 역 따옴표 또는 특수 괄호 인용 부호를 사용하여 실행해야합니다.

file=`basename "$1"` 
file=$(basename "$1") 

이 (가 필요하다 그 이유는) 당신이 다음 $file의 값을 가져 기간에 모든 것을 제거합니다

ext=${file#*.} 

이 작업을 수행해야합니다 파일 이름의 확장자를 제거하십시오. 파일 이름에 마침표가 포함 된 경우 ext=${file##*.}을 사용해야합니다. ##은 bash에 가장 짧은 문자열 대신 가장 짧은 문자열을 삭제하도록 알려주기 때문에 첫 번째 문자열 대신 마지막 마침표까지 삭제합니다.

echo $basename $1이 이상합니다. bash에게 $basename이라는 변수의 값과 스크립트의 첫 번째 인수 인 변수 $1의 값을 출력하도록 알려줍니다. 당신이 실행하려는 명령을 인쇄하려면

, 이렇게 :

: 명령의 출력을 인쇄하려는 경우, 당신이 중 하나를 수행 할 수

echo basename $1 

echo $(basename "$1") 
echo "$file" 
basename "$1" 

호프가 도움이 됨 =)