Bạn đang gán files
như 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/*.pdf
biến $files
vô 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 sh
thay vì bash
ở đây bằng cách viết nó:
#!/bin/sh -
[ "$#" -gt 0 ] || set -- ~/print/*.pdf
for file do
ls -d -- "$file"
done
set
là để 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ì $files
khô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 $HOME
chứ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 .