Không thể kết hợp 2 biến


1

Tôi cần nối 2 biến chuỗi trong bash trên máy Centos 6 của mình

for f in *.tar.gz;
do
basename ${f%.tar.gz}
echo $basename
dbaddress='mysql/*.sql'
path="${basename}${dbaddress}"  
echo $path
tar -zxvf $f $path
done

Tập lệnh sẽ trích xuất tất cả các tệp .sql bên trong thư mục basename / mysql /. Nhưng đầu ra của mã của tôi là như sau:

basename

mysql/*.sql
tar: mysql/*.sql: Not found in archive
tar: Exiting with failure status due to previous errors

Như bạn thấy, tên cơ sở $ không được thêm vào $ dbaddress. Tui bỏ lỡ điều gì vậy?

Câu trả lời:


2

Bạn đang tham chiếu basenamebiến (với $basename), nhưng không bao giờ gán nó cho bất cứ thứ gì, có nghĩa là nó đọc thành bashmột chuỗi rỗng. Bạn có thể cần phải thử basename=${f%.tar.gz}.


Cảm ơn bạn, nó làm việc như một nét duyên dáng! Nhưng tôi tự hỏi tại sao echo $ basename lại in đúng tên tệp.
KarenV

Không phải vậy; nó đang lặp lại một dòng trống, vì $basenamekhông xác định được. các basenamelệnh là những gì đã được xuất ra gốc filename. Xem man basename- nếu bạn không khai báo một phần mở rộng, nó sẽ trả về toàn bộ tên tệp của tệp được chỉ định (ngay cả khi nó không tồn tại).
DopeGhoti

1

Bạn có thể thử điều này để kết hợp hai biến:

var1="Hello"
var2="$var1 world!"

Nhưng trong mã của bạn, bạn không khai báo basenamebiến!


0

Hãy thử basename=${f%.tar.gz}.

Để gỡ lỗi các vấn đề như thế này, hãy đặt set -xtrước vòng lặp trong tập lệnh của bạn và bạn sẽ thấy mỗi lệnh đang thực thi ( set +xđể tắt điều đó).

Bạn sẽ thấy rằng bạn thực sự đang thực thi lệnh basename ${f%.tar.gz}, có lẽ là trên tệp basename.tar.gzchỉ lặp lại basenamenhưng không lưu nó vào bất kỳ biến nào. Sau đó, bạn echo $basenamevà biến basenamelà trống, đó là lý do tại sao bạn thấy một dòng trống trong đầu ra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.