我想对目录中的子目录列表进行操作。考虑:
for x in x86-headers/*/C/populate.sh; do echo $x; done
这给
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
但我想值对应于路径的第二部分
elf
,gl
等我知道如何去掉领先x86-headers
。
for x in x86-headers/*/C/populate.sh; do i=${x##x86-headers/}; echo $i; done
这使
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
我也知道如何删除路径中的后续术语。即下降一级:
cd x86-headers
for x in */C/populate.sh; do i=${x%%/*}; echo $i; done
给
elf
gl
gmp
gnome2
gtk2
jni
libc
但是,尝试将这些结合起来是行不通的。即
for x in x86-headers/*/C/populate.sh; do i=${${x##x86-headers}%%/*}; echo $i; done
给
bash: ${${x##x86-headers}%%/*}: bad substitution
毫无疑问,这是不正确的语法,但是我不知道正确的语法。当然,可能会有更好的方法来执行此操作。如果我使用的是Python,我会使用split on /
将每个路径分成一个列表,然后选择第二个元素,但是我不知道如何在bash中做到这一点。
编辑:感谢您的答案。我还应该问,是否可以轻便地执行此操作,如果可以,如何执行?
i=${x#*/}; i=${i%%/*}
是可选的,对吧?