2010-04-30 9 views
10

Sau đây là một đoạn của một kịch bản bash mà tôi đang chạy dưới Cygwin trên Windows:mkdir lỗi trong kịch bản bash

deployDir=/cygdrive/c/Temp/deploy 

timestamp=`date +%Y-%m-%d_%H:%M:%S` 
deployDir=${deployDir}/$timestamp 

if [ ! -d "$deployDir" ]; then 
    echo "making dir $deployDir" 
    mkdir -p $deployDir 
fi 

này tạo ra sản lượng như:

making dir /cygdrive/c/Temp/deploy/2010-04-30_11:47:58 
mkdir: missing operand 
Try `mkdir --help' for more information. 

Tuy nhiên, nếu Tôi gõ /cygdrive/c/Temp/deploy/2010-04-30_11:47:58 trên dòng lệnh nó thành công, tại sao lệnh tương tự không hoạt động trong tập lệnh?

Cảm ơn, Don

Trả lời

24

Thay đổi:

mkdir -p $deploydir 

để

mkdir -p "$deployDir" 

Giống như hầu hết các vỏ Unix (có thể là tất cả trong số chúng), Bourne (Again) Shell (sh/bash) phân biệt chữ hoa chữ thường. Biến dir được gọi là deployDir (trường hợp hỗn hợp) ở mọi nơi ngoại trừ lệnh mkdir, trong đó nó được gọi là deploydir (tất cả chữ thường). Kể từ deploydir (tất cả chữ thường) được coi là biến riêng biệt từ deployDir (trường hợp hỗn hợp) và deplydir (tất cả chữ thường) chưa bao giờ có giá trị được gán cho nó, giá trị deploydir (tất cả chữ thường) là chuỗi rỗng ("").

Không có dấu ngoặc kép (mkdir $deploydir), dòng có hiệu quả trở thành mkdir (chỉ lệnh mà không có toán hạng bắt buộc), do đó lỗi mkdir: missing operand.

Với dấu ngoặc kép (mkdir "$deploydir"), dòng có hiệu quả trở thành mkdir "" (lệnh tạo thư mục có tên thư mục không hợp lệ của chuỗi rỗng), do đó lỗi mkdir: cannot create directory '.

Sử dụng biểu mẫu có dấu ngoặc kép (mkdir "$deployDir") được đề xuất trong trường hợp tên thư mục đích bao gồm dấu cách.

8

Thay đổi:

mkdir -p $deploydir 

để

mkdir -p "$deploydir" 
1

Bạn không thể có dấu hai chấm trong tên tệp trên Windows, vì lý do hiển nhiên.

+0

Đó là sự thật. Nhưng ai nói gì về Windows? –

+0

@Dennis: Câu hỏi? "[...] chạy dưới Cygwin trên Windows"? – unwind

+0

Rất tiếc, trở lại trường mẫu giáo cho tôi. Tuy nhiên, Cygwin không hỗ trợ dấu hai chấm trong tên tập tin. –