- PR -

bシェル上でのファイル複数選択

1
投稿者投稿内容
やすけ
ベテラン
会議室デビュー日: 2003/08/20
投稿数: 87
投稿日時: 2006-12-19 16:35
nakamuraと申します。bシェルにて圧縮ファイルを一覧にしてどのファイルを解凍させるか選択させて選択した番号のファイルを解凍するというシェルを作成しています。
ここで大きな課題が見つかってしまいました。というのは複数あるファイルの中からどの番号を選択しても一番最後の処理番号のファイルが選択されてしまいます。実際、このシェルを修正するとなると、その部分は自分が作成したものではないものでどう修正してよいのかわかりません。どなたかヒントでも良いのでご教授してくださいますでしょうか?下記にそのbシェルを記述します。
おそらく、同じ変数「arg」にセットしているからだと思うのですが、このargを配列に出来たらいいなあと思いました。シェルでも配列という概念があるのでしょうか。
なにぶん、Linux初心者ですのでよろしくお願いします。
--------------------------------------------------------------------
echo " 解凍するファイルの処理番号を選択してください"
for arg in *.dmp.lzh
do
if [ -f $arg ]; then
flist="$flist $arg"
echo "処理番号 $i: $arg"
i=`expr $i + 1`
fi
done
echo -e "処理番号を選択してください:\c";read ShoriNo
echo -e "続行するにはEnterキーを押してください。\c";read enter
case $ShoriNo in
"")
echo "解凍を中止しました。"
exit 0;;
*)
echo "解凍開始!"
/usr/local/bin/lha xf $arg
;;
esac
;;
--------------------------------------------------------------------
F/A
ぬし
会議室デビュー日: 2006/03/18
投稿数: 312
お住まい・勤務地: Tokyo
投稿日時: 2006-12-19 23:33
一般的にLinuxのシェルはBシェルではなく、bashがデフォルトです。
(ディストリビューションによるかもしれませんが…)

Bシェルがデフォルトなのは、Solarisでしょうか?
HP-UXだとPOSIXシェルとか…AIXはkshとか、そんなのでしたっけ?

で、Linuxのbashであれば配列は使用可能です。
ただし、他のベーシックなB系シェルで使用可能かは知りません。

test[0]=abcde で代入
echo ${test[0]} で出力。

$iでカウントさせてるのなら test[$i]=$arg などとして代入させて、
/usr/local/bin/lha xf ${test[$ShoriNo]} とすればいかがでしょうか?



[ メッセージ編集済み 編集者: F/A 編集日時 2006-12-19 23:39 ]
やすけ
ベテラン
会議室デビュー日: 2003/08/20
投稿数: 87
投稿日時: 2006-12-20 09:33
F/Aさん、レスありがとうございます。以外と簡単だったので拍子抜けしました。でも
本当に助かりました。ありがとうございました。
一般的にはbashというんですね。いつもbシェル、bシェルって言っていた癖がついて
しまいました。bashってバッシュって読むんですよね。。。恥ずかしくて人に中々聞けなくて。って今聞いてますね。それと、配列の初期化みたいなのはあるのでしょうか?
アクセスとかvbだと、erase aaaaとやると初期化されるのですが、bashではそんなこと可能でしょうか。
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2007-01-04 15:27
こんにちは。

> それと、配列の初期化みたいなのはあるのでしょうか?
> アクセスとかvbだと、erase aaaaとやると初期化されるのですが、bashではそんなこと可能でしょうか。

初期化というか、全消去ですかね。
であれば、“unset 配列名”で。配列に限らず、定義した変数や関数の削除に用います。

別のアプローチとしては、関数を用いる方法。
関数内の閉じたスコープで使用する ( レキシカル変数 ) なら、初期化を考える必要性は小さくなると思います。
で、代わりに declare での宣言を明示的に行います。
通常、配列の宣言は -a なのですが、+a とするとレキシカルになります。

例:
コード:
$ function hoge() {
declare +a hoge_list
hoge_list[0]=aaa
hoge_list[1]=bbb
echo ${hoge_list[*]}
}
$ hoge
aaa bbb
$ echo ${hoge_list[*]}
                ← 出力なし
$ declare -ap | grep hoge_list
$                ← 出力なし


詳しくは、help unset や help declare、help function で。
リダーマーク
会議室デビュー日: 2007/01/04
投稿数: 6
投稿日時: 2007-01-04 16:59
こんにちは。

本題と関係ない投稿で恐縮ですが、
bシェルと呼んでいて正解だと思いますよ。
その場合は、/bin/sh を指して、bashなら、/bin/bash です。
シェルの先頭に、#!/bin/sh とか書いてやれば bシェルで実行されます。
bashで実行させてあげたければ #!/bin/bash ですね。

(sh も bash も /bin /usr/bin 2箇所に同じものがあるんですね。
シンボリックリンクにしないのはどうしてだろう。。)

ごめんなさい、修正します。
今は、 sh,bash ひっくるめてbシェルって呼んでるんですね。
失礼しました。

[ メッセージ編集済み 編集者: リダーマーク 編集日時 2007-01-04 17:04 ]
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2007-01-04 17:21
脱線しますが、

> (sh も bash も /bin /usr/bin 2箇所に同じものがあるんですね。
> シンボリックリンクにしないのはどうしてだろう。。)

この環境は何でしょう? 気になります。
/bin が /usr/bin へのシンボリックリンクになっている Solaris 等の環境ではないのですよね?

※ CentOS 4 なら、/bin/sh → /bin/bash とシンボリックリンクがはられていて、/usr/bin には sh, bash はありませんね。なお、sh として起動すると、bash として起動するのと挙動が若干変わります。
リダーマーク
会議室デビュー日: 2007/01/04
投稿数: 6
投稿日時: 2007-01-04 18:13
大変失礼しました。

/bin -> /usr/bin でした。
お恥ずかしい・・・

ちなみに、ご推察のとおり、Solaris9 です。(SunOS 5.9) 
1

スキルアップ/キャリアアップ(JOB@IT)