ディレクトリ内のサブディレクトリのリストを操作したい。検討してください:
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
しかし、私は対応して経路の第2の部分に、という値が欲しい
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
また、パスの後半の用語を取り除く方法も知っています。つまり、1レベル下がっています。
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 /
を使用して各パスをリストに分割し、2番目の要素を選択しますが、bashでそれを行う方法がわかりません。
編集:答えてくれてありがとう。私も尋ねるべきだったのですが、これをポータブルに行うことは可能ですか?そうであれば、どのようにですか?
i=${x#*/}; i=${i%%/*}
はオプションですよね?