Nếu $VARIABLE
chuỗi của bạn là một chuỗi chứa khoảng trắng hoặc các ký tự đặc biệt khác và dấu ngoặc vuông đơn được sử dụng (là lối tắt cho test
lệnh), thì chuỗi có thể được chia thành nhiều từ. Mỗi trong số này được coi là một đối số riêng biệt.
Vì vậy, một biến được chia thành nhiều đối số :
VARIABLE=$(/some/command);
# returns "hello world"
if [ $VARIABLE == 0 ]; then
# fails as if you wrote:
# if [ hello world == 0 ]
fi
Điều tương tự cũng sẽ đúng với bất kỳ lệnh gọi hàm nào đặt chuỗi chứa khoảng trắng hoặc các ký tự đặc biệt khác.
Dễ dàng sửa chữa
Gói đầu ra biến trong dấu ngoặc kép, buộc nó ở lại dưới dạng một chuỗi (do đó là một đối số). Ví dụ,
VARIABLE=$(/some/command);
if [ "$VARIABLE" == 0 ]; then
# some action
fi
Đơn giản như vậy. Nhưng bỏ qua "Cũng hãy cẩn thận ..." bên dưới nếu bạn cũng không thể đảm bảo biến của mình sẽ không phải là một chuỗi trống hoặc một chuỗi không chứa gì ngoài khoảng trắng.
Hoặc, một sửa chữa thay thế là sử dụng dấu ngoặc vuông đôi (là một phím tắt cho new test
lệnh).
Tuy nhiên, điều này chỉ tồn tại trong bash (và rõ ràng là korn và zsh), và do đó có thể không tương thích với các shell mặc định được gọi bởi /bin/sh
v.v.
Điều này có nghĩa là trên một số hệ thống, nó có thể hoạt động từ bàn điều khiển nhưng không phải khi được gọi ở nơi khác, như từcron
, tùy thuộc vào cách mọi thứ được cấu hình.
Nó sẽ trông như thế này:
VARIABLE=$(/some/command);
if [[ $VARIABLE == 0 ]]; then
# some action
fi
Nếu lệnh của bạn chứa dấu ngoặc vuông như thế này và bạn gặp lỗi trong nhật ký nhưng nó hoạt động từ bảng điều khiển, hãy thử hoán đổi [[
một thay thế được đề xuất ở đây, hoặc, đảm bảo rằng bất cứ điều gì chạy tập lệnh của bạn đều sử dụng shell hỗ trợ [[
aka new test
.
Cũng hãy cẩn thận với [: unary operator expected
lỗi
Nếu bạn thấy lỗi "quá nhiều đối số", rất có thể bạn đang nhận được một chuỗi từ một hàm có đầu ra không thể đoán trước. Nếu cũng có thể có được một chuỗi rỗng (hoặc tất cả các chuỗi khoảng trắng), thì điều này sẽ được coi là đối số bằng 0 ngay cả với "sửa chữa nhanh" ở trên và sẽ thất bại với[: unary operator expected
Nó giống như 'gotcha' nếu bạn đã sử dụng các ngôn ngữ khác - bạn không mong muốn nội dung của một biến được in một cách hiệu quả vào mã như thế này trước khi nó được đánh giá.
Đây là một ví dụ ngăn cả lỗi [: too many arguments
và [: unary operator expected
lỗi: thay thế đầu ra bằng giá trị mặc định nếu nó trống (trong ví dụ này 0
), với dấu ngoặc kép được bao quanh toàn bộ:
VARIABLE=$(/some/command);
if [ "${VARIABLE:-0}" == 0 ]; then
# some action
fi
(ở đây, hành động sẽ xảy ra nếu $ VARIABLE bằng 0 hoặc trống. Đương nhiên, bạn nên thay đổi 0 (giá trị mặc định) thành giá trị mặc định khác nếu muốn có hành vi khác)
Lưu ý cuối cùng: Vì [
là một phím tắt cho test
, tất cả những điều trên cũng đúng với lỗi test: too many arguments
(và cả test: unary operator expected
)