Tôi khuyên bạn không nên làm điều đó chút nào. Thứ nhất, nó dài hơn và phức tạp hơn nhiều so với việc chỉ cần viết
ls/
df ~
du -hs ~/Devel/
Thứ hai, các chuỗi phẳng không thể lưu trữ các chuỗi được phân cách bằng dấu cách, không gian. Không có cách nào (và có, tôi bỏ qua eval
) để phân biệt giữa các khoảng trống tách biệt các lệnh và khoảng trắng tách các đối số trong một lệnh. Bạn có thể sử dụng một mảng cho lệnh đơn giản, nhưng bạn không thể lồng mảng, vì vậy ngay sau khi đối số cho một trong các lệnh của bạn chứa dấu cách, bạn sẽ quay lại vấn đề ban đầu.
commands=("ls /" "df ~" "du -hs ~/Devel") # OK, but...
commands=("ls \"foo bar\"" "echo 'hello world'") # No.
Nếu bạn muốn tập lệnh của bạn có thể chạy các tệp tùy ý được chỉ định thay thế (nghĩa là, triển khai hệ thống trình cắm).
command_dir=~/myscript_plugins
for f in "$command_dir"; do
source "$f"
done
nơi một tệp cho mỗi lệnh bạn muốn chạy.
Hoặc, xác định một loạt các chức năng, và lưu trữ tên của họ trong một chuỗi (tên hàm không thể chứa khoảng trắng, vì vậy không cần cho mảng):
lister() { ls /; }
dfer() { df ~; }
duer() { du -hs ~/Devel; }
commands="lister dfer duer"
for command in $commands; do
$command
done
hoặc
commands=(lister dfer duer)
for command in "${commands[@]}"; do
$command
done
Đọc thêm: I'm trying to put a command in a variable, but the complex cases always fail!
Đây là câu trả lời đúng cho câu hỏi cụ thể được hỏi, nhưng như chepner đã chỉ ra, đó là một bước chính xác xuống đường dẫn sai. –
@GordonDavisson Một số người nghĩ về việc họ có thể hay không trong khi những người khác nghĩ về việc họ có nên hay không. Tôi có xu hướng là loại đầu tiên. : D – PSkocik