Tôi muốn hành động trên một danh sách các thư mục con trong một thư mục. Xem xét:
for x in x86-headers/*/C/populate.sh; do echo $x; done
Điều này mang lại
x86-headers/elf/C/populate.sh
x86-headers/gl/C/populate.sh
x86-headers/gmp/C/populate.sh
x86-headers/gnome2/C/populate.sh
x86-headers/gtk2/C/populate.sh
x86-headers/jni/C/populate.sh
x86-headers/libc/C/populate.sh
Nhưng tôi muốn các giá trị tương ứng với phần thứ hai của đường dẫn,
elf
, gl
, vv Tôi biết làm thế nào để lột hàng đầu x86-headers
.
for x in x86-headers/*/C/populate.sh; do i=${x##x86-headers/}; echo $i; done
cái nào cho
elf/C/populate.sh
gl/C/populate.sh
gmp/C/populate.sh
gnome2/C/populate.sh
gtk2/C/populate.sh
jni/C/populate.sh
libc/C/populate.sh
Tôi cũng biết làm thế nào để loại bỏ các điều khoản sau này trong đường dẫn. Tức là đi xuống một cấp:
cd x86-headers
for x in */C/populate.sh; do i=${x%%/*}; echo $i; done
cho
elf
gl
gmp
gnome2
gtk2
jni
libc
Nhưng, cố gắng kết hợp những thứ này không hoạt động. I E
for x in x86-headers/*/C/populate.sh; do i=${${x##x86-headers}%%/*}; echo $i; done
cho
bash: ${${x##x86-headers}%%/*}: bad substitution
Không nghi ngờ gì đây là cú pháp không chính xác, nhưng tôi không biết cú pháp chính xác. Tất nhiên có thể có những cách tốt hơn để làm điều này. Nếu tôi đang sử dụng Python, tôi sẽ sử dụng split on /
để chia từng đường dẫn thành một danh sách, sau đó chọn phần tử thứ hai, nhưng tôi không biết làm thế nào để làm điều đó trong bash.
EDIT: Cảm ơn câu trả lời. Tôi cũng nên hỏi, liệu có thể làm điều này một cách hợp lý, và nếu vậy, làm thế nào?
i=${x#*/}; i=${i%%/*}
là tùy chọn, phải không?