Bạn đang gán filesnhư một biến vô hướng thay vì biến mảng .
Trong
files=$HOME/print/*.pdf
Bạn đang gán một số chuỗi như /home/highsciguy/print/*.pdfbiến $filesvô hướng (hay còn gọi là chuỗi).
Sử dụng:
files=(~/print/*.pdf)
hoặc là
files=("$HOME"/print/*.pdf)
thay thế. Shell sẽ mở rộng mô hình toàn cầu đó thành một danh sách các đường dẫn tệp và gán từng đường dẫn đó cho các phần tử của $files mảng .
Việc mở rộng toàn cầu được thực hiện tại thời điểm chuyển nhượng.
Bạn không phải sử dụng các tính năng sh không chuẩn và bạn có thể sử dụng hệ thống của mình shthay vì bashở đây bằng cách viết nó:
#!/bin/sh -
[ "$#" -gt 0 ] || set -- ~/print/*.pdf
for file do
ls -d -- "$file"
done
setlà để gán các "$@"mảng của các tham số vị trí.
Một cách tiếp cận khác có thể là lưu trữ mẫu hình cầu trong một biến vô hướng:
files=$HOME/print/*.pdf
Và có vỏ mở rộng toàn cầu tại thời điểm $files biến được mở rộng.
IFS= # disable word splitting
for file in $files; do ...
Ở đây, vì $fileskhông được trích dẫn (mà bạn không thường làm), việc mở rộng của nó có thể bị chia tách từ (mà chúng tôi đã vô hiệu hóa ở đây) và tạo tên tập tin / tên tập tin.
Vì vậy, *.pdf sẽ được mở rộng vào danh sách các tập tin phù hợp. Tuy nhiên, nếu $HOMEchứa các ký tự đại diện, chúng cũng có thể được mở rộng, đó là lý do tại sao vẫn nên sử dụng biến mảng.
files=$*bao giờ bình thường ? Điều đó hoàn toàn sai .