Tôi đang chạy loại mã này:
#!/usr/bin/env bash
set -u
exclude1='--exclude=/path/*'
exclude2='--exclude=/path with spaces/*'
exclude3='' # any 'exclude' can be empty
tar -czf backup.tgz "$exclude1" "$exclude2" "$exclude3" 2>&1 | grep -i 'my_reg_exp' > error.log
RESULT=("${PIPESTATUS[@]}")
... etc ...
Khi tôi chạy mã này, tôi gặp lỗi này:
tar: : Cannot stat: No such file or directory
Điều này là do "$ Elim3" được dịch là một đối số trống. Chính xác như thể tôi đã làm điều này:
tar -czf backup.tgz "$exclude1" "$exclude2" ''
Một cách để tránh lỗi này là xóa dấu ngoặc kép quanh $ ElimX. Nhưng đây là một vấn đề nếu $ ElimX chứa bất kỳ khoảng trắng hoặc các ký tự lạ khác.
Một cách khác là sử dụng eval
nhưng vì tôi cần giữ dấu ngoặc kép, tôi không thấy cách loại bỏ dấu ngoặc kép VÀ các đối số trống khi cần.
Giải pháp duy nhất tôi tìm thấy là xây dựng dòng lệnh với nối chuỗi:
CMD='tar -czf backup.tgz'
if [[ -n "$exclude1" ]]; then CMD+=" \"$exclude1\" "; fi
if [[ -n "$exclude2" ]]; then CMD+=" \"$exclude2\" "; fi
if [[ -n "$exclude3" ]]; then CMD+=" \"$exclude3\" "; fi
eval $CMD 2>&1 | grep -i 'my_reg_exp' > error.log
RESULT=("${PIPESTATUS[@]}")
... etc ...
Bất cứ ai có một ý tưởng thông minh hơn?