Lỗi cú pháp gần mã thông báo bất ngờ `('


11

Khi tôi sử dụng mã dưới đây trong thiết bị đầu cuối Ubuntu, nó hoạt động tốt:

rm !(*.sh) -rf

Nhưng nếu tôi đặt cùng một mã dòng trong tập lệnh shell (clean.sh) và chạy tập lệnh shell từ terminal, nó sẽ báo lỗi:

kịch bản sạch.sh:

#!/bin/bash
rm !(*.sh) -rf

Lỗi tôi nhận được:

./clean.sh: line 2: syntax error near unexpected token `('
./clean.sh: line 2: `rm !(*.sh) -rf'

bạn có thể giúp?


Câu trả lời:


23

rm !(*.sh)là một extglobcú pháp có nghĩa là loại bỏ tất cả các tệp ngoại trừ những tệp có .shphần mở rộng.

Trong bashtrường hợp tương tác của bạn , tùy chọn shell extglobđược bật:

$ shopt extglob 
extglob         on

Bây giờ khi tập lệnh của bạn đang chạy trong một khung con, bạn cần kích hoạt extglobbằng cách thêm tập lệnh này vào đầu tập lệnh:

shopt -s extglob

Vì vậy, kịch bản của bạn trông giống như:

#!/bin/bash
shopt -s extglob
rm -rf -- !(*.sh)

BIÊN TẬP :

Để xóa tất cả các tệp ngoại trừ các tệp .shmở rộng sử dụng GLOBIGNORE(như bạn không muốn bật extglob):

#!/bin/bash
GLOBIGNORE='*.sh'
rm -rf *

Thí dụ :

$ ls -1
barbar
bar.sh
egg
foo.sh
spam

$ GLOBIGNORE='*.sh'

$ rm *

$ ls -1
bar.sh
foo.sh

Tôi có thể thay đổi lệnh của tôi mà làm tương tự mà không chạy này? shopt -s extglob?
Tal

@Tal kiểm tra các chỉnh sửa của tôi ..
heemayl

1
cảm ơn :) (stack overflaw khiến tôi viết 15 ký tự trong bình luận :( :( :()
Tal

nhưng ở đây có hai câu trả lời hay!
Tal

1
Đây phải là câu trả lời được chấp nhận, vì nó thực sự trả lời câu hỏi, trong khi câu trả lời khác chỉ mô tả một cách giải quyết.
Guntram Blohm hỗ trợ Monica

4

Ok, đó là một bài viết chéo, nhưng tôi phải viết một câu trả lời. ;)

Bạn có thể sử dụng findthay thế

find . -maxdepth 1 ! -name '*.sh' -exec rm -rf {} \;

2

Bạn cần bật extglob:

shopt -s extglob

1
@ Pilot6: Xem man bash. Nó cho phép mở rộng toàn cầu như thế nào !(...).
choroba

Tôi có thể thay đổi lệnh của tôi mà làm tương tự mà không chạy này? shopt -s extglob
Tal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.