web-dev-qa-db-ja.com

ディレクトリのリストをBashの配列にどのように保存しますか(そしてそれらを印刷しますか)?

ユーザーが入力したディレクトリのリストを表示するシェルスクリプトを作成し、ユーザーがディレクトリの数に基づいてインデックス番号を持つディレクトリの1つを選択するようにしたい

私はこれが何らかの配列操作であると考えていますが、シェルスクリプトでこれを行う方法がわかりません

例:

> whichdir
There are 3 dirs in the current path
1 dir1
2 dir2
3 dir3
which dir do you want? 
> 3
you selected dir3!
23
qodeninja
$ ls -a
./ ../ .foo/ bar/ baz qux*
$ shopt -s dotglob
$ shopt -s nullglob
$ array=(*/)
$ for dir in "${array[@]}"; do echo "$dir"; done
.foo/
bar/
$ for dir in */; do echo "$dir"; done
.foo/
bar/
$ PS3="which dir do you want? "
$ echo "There are ${#array[@]} dirs in the current path"; \
select dir in "${array[@]}"; do echo "you selected ${dir}"'!'; break; done
There are 2 dirs in the current path
1) .foo/
2) bar/
which dir do you want? 2
you selected bar/!
39

配列構文

ディレクトリが配列に格納されていると仮定します:

dirs=(dir1 dir2 dir3)

これにより、配列の長さを取得できます。

echo "There are ${#dirs[@]} dirs in the current path"

次のようにループすることができます:

let i=1

for dir in "${dirs[@]}"; do
    echo "$((i++)) $dir"
done

そして、ユーザーの答えが得られたと仮定すると、次のようにインデックスを作成できます。配列は0ベースであるため、3番目のエントリはインデックス2であることに注意してください。

answer=2

echo "you selected ${dirs[$answer]}!"

見つける

とにかく、どのようにしてファイル名を配列に入れますか?少し注意が必要です。 findがある場合、これが最良の方法かもしれません。

readarray -t dirs < <(find . -maxdepth 1 -type d -printf '%P\n')

-maxdepth 1はサブディレクトリの検索を停止し、-type dはディレクトリを検索してファイルをスキップするように指示し、-printf '%P\n'は先頭に./を付けずにディレクトリ名を印刷するよう指示します印刷が好きです。

23
John Kugelman
#! /bin/bash

declare -a dirs
i=1
for d in */
do
    dirs[i++]="${d%/}"
done
echo "There are ${#dirs[@]} dirs in the current path"
for((i=1;i<=${#dirs[@]};i++))
do
    echo $i "${dirs[i]}"
done
echo "which dir do you want?"
echo -n "> "
read i
echo "you selected ${dirs[$i]}"
5
Jester

Bashは 1次元配列 をサポートするようになりました。配列は連続した要素を持つ必要がないため、マップのように見えます。

1
Brian Agnew