2012-10-11 24 views
7

Tôi đang cố gắng viết một tập lệnh lấy tên cơ sở của đối số, sau đó kiểm tra xem có phần mở rộng trong đối số đó hay không. Nếu có, nó sẽ in phần mở rộng.Cú pháp tên cơ sở Bash

Đây là mã của tôi:

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

Tôi lặp lại trận chung kết $ basename $ 1 để kiểm tra những gì đầu ra của basename là.

Một số xét nghiệm cho thấy:

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 

Vì vậy, không phải $ basename $ 1 đang làm việc. Tôi biết đó là một lỗi cú pháp để ai đó có thể giải thích những gì tôi đang làm sai?

EDIT:

Tôi đã giải quyết vấn đề của tôi bây giờ với:

file=$(basename "$1") 
stub=${file%.*} 
echo ${file#"$stub"} 

nào giảm tranh luận của tôi đến một basename, cảm ơn tất cả các bạn.

+0

Cú pháp chính xác là tệp = $ (tên cơ bản $ 1). Tôi khuyên bạn nên sử dụng tệp = $ {1 ## * /}, thao tác này sẽ xóa mọi chuỗi '* /'. Nó thực sự nhanh hơn nhiều so với lệnh basename, đặc biệt khi xử lý các tập tin trong một vòng lặp. –

Trả lời

12

Đầu tiên, cú pháp của bạn là sai:

file=$(basename "$1") 

Thứ hai, đây là biểu hiện chính xác để có được (cuối cùng) mở rộng tên tập tin của:

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

Cảm ơn phần đầu tiên, tôi nhận ra rằng bây giờ các tập tin bằng với đầu ra của tên cơ sở, để giúp.Bây giờ chương trình của tôi không hoạt động như dự định, có nghĩa là nó giả mạo tester.two thay vì. Hai nếu đối số ban đầu của tôi là tester.two. Trước khi tôi thêm tên nền tảng, kịch bản của tôi đã được đưa ra ngoài dự định khi tôi thử nghiệm ../tester, sẽ không xuất được gì. – Unknown

8

Nếu bạn muốn gán cho một biến đầu ra của lệnh, bạn phải thực thi nó, với dấu ngoặc kép hoặc sử dụng dấu ngoặc đơn đặc biệt trích dẫn:

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

Để loại bỏ phần mở rộng của tên tập tin bạn nên làm

ext=${file#*.} 

này sẽ nhận được giá trị của $file, sau đó loại bỏ tất cả mọi thứ lên đến giai đoạn này (đó là lý do tại sao nó là cần thiết). Nếu tên tệp của bạn có dấu chấm, thì bạn nên sử dụng ext=${file##*.}, trong đó ## yêu cầu bash xóa chuỗi dài nhất khớp với chuỗi ngắn nhất, vì vậy nó sẽ xóa đến giai đoạn cuối thay vì giá trị đầu tiên.

echo $basename $1 của bạn là điều đáng sợ. Nó được cho bash để in giá trị của một biến gọi là $basename và giá trị của biến $1, là đối số đầu tiên cho tập lệnh (hoặc hàm).

Nếu bạn muốn in các lệnh bạn đang cố gắng để thực hiện, thực hiện điều này:

echo basename $1 

Nếu bạn đang cố gắng để in đầu ra của lệnh, bạn có thể làm một trong số:

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

Hy vọng điều này sẽ giúp =)

Các vấn đề liên quan