2011-06-18 46 views
40

Tôi cố gắng để hiểu được một kịch bản kiểm tra, trong đó bao gồm các phân đoạn sau:

SCRIPT_PATH=${0%/*} 
if [ "$0" != "$SCRIPT_PATH" ] && [ "$SCRIPT_PATH" != "" ]; then 
    cd $SCRIPT_PATH 
fi 

${0%/*} đứng cho? Cảm ơn

Trả lời

60

Nó được gọi là Parameter Expansion. Hãy xem this page và phần còn lại của trang web.

${0%/*} làm là, nó mở rộng giá trị chứa trong luận 0 sự (đó là con đường mà gọi là kịch bản) sau khi loại bỏ các hậu tố chuỗi /* từ ngày kết thúc của nó.

Vì vậy, $0 cũng giống như ${0} giống như bất kỳ đối số nào khác, ví dụ: $1 mà bạn có thể viết là ${1}. Như tôi đã nói $0 là đặc biệt, vì nó không phải là một đối số thực sự, nó luôn ở đó và đại diện cho tên của tập lệnh. Mở rộng tham số hoạt động trong các số {} - dấu ngoặc nhọn và % là một loại Mở rộng thông số.

%/* khớp với lần xuất hiện cuối cùng của / và xóa mọi thứ (* có nghĩa là bất kỳ điều gì) sau ký tự đó. Hãy xem ví dụ đơn giản này:

$ var="foo/bar/baz" 
$ echo "$var" 
foo/bar/baz 
$ echo "${var}" 
foo/bar/baz 
$ echo "${var%/*}" 
foo/bar 
+2

như vậy, đó là aa 'cái dirname ($ 0) ' – jm666

+5

trong kịch bản này, vâng, nó hoạt động như' dirname "$ 0" 'nhưng nó có thể gây ra vấn đề. Nếu bạn gọi kịch bản như thế này: 'bash script' thì' $ {0/*} 'không cung cấp cho bạn đường dẫn, nó trả về tên kịch bản, hoặc nếu bạn chỉ định đường dẫn đầy đủ (_/path/to/script_) trả về không có gì, vì vậy nó không đảm bảo hoạt động như mong đợi trong mọi tình huống. – c00kiemon5ter

+0

Tôi đang bận gõ một câu hỏi về superuser về một dòng có điều này, tôi đã viết trong câu hỏi của tôi rằng tôi thường gõ các phần của mã vào google để có được kết quả nhưng dường như tôi đã quên điều đó nhưng ngay khi tôi chia tay câu hỏi và phân tích nó trước khi đăng, tôi googled chỉ '$ {0%}' và hạ cánh ở đây, bạn đã làm cho nó rõ ràng cho tôi :) – SidOfc

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