下記のBシェルファイルで、あるテキストファイルの内容を1行ずつ読み込んで、その行を変数に代入し、後続にてその変数を表示するという処理を実現したいのですが、うまくいきません。
どのようにすればうまく行くのかまた、何故うまくいかなかったのかをご教授頂ければと思っております。
宜しくお願い致します。
<Bシェルファイル>
#!/bin/sh
exec 3<&0 < TBL.txt
count=0
while read line
do
ex$count=$line
count=`expr $count + 1`
done
exec 0<&3 3<&-
echo ${ex[1]}
exit 0
<結果>
aho.sh: ex0=A コマンドが見つかりません。
aho.sh: ex1=B コマンドが見つかりません。
aho.sh: ex2=C コマンドが見つかりません。
aho.sh: 置換が正しくありません
No.2ベストアンサー
- 回答日時:
bashであれば#1の方が書かれたように配列が使えますが、純粋なBシェルでは配列は使えません。
exec 3<&0 < TBL.txt
count=0
while read line
do
eval ex$count=\$line
count=`expr $count + 1`
done
exec 0<&3 3<&-
echo $ex1
のようにします。
最後のechoのところで、添字が変数のときは、
eval echo \$ex$count
のようにします。
何故上手く行かないのかは、シェルが変数置換したり、* を展開したり、' や " や \ 等の特殊文字を処理したり、組み込みコマンドの判断をしたりには一定の順序があるということです。
ex$count=$line はイコールの左辺がシェル変数の形式をしていない($がある)ため、シェル変数への代入と見なされません。この判断は $ による変数置換の前に終わってしまいます。変数置換後に外部コマンド呼び出しの構文と解釈されます。変数置換後には代入コマンドかどうかの判断は行われません。
eval はそれらの解釈をもう一度やり直すコマンドです。
eval ex$count=\$line の場合、$countの置換 と、\$ を $ に置換したあとの、ex0=$line をもう一度最初から解釈しなおすので、代入コマンドとなります。
No.1
- 回答日時:
よくわかんないけど、表題の件からして、こんな感じ?
x.txt
1111111111
2222222222
3333333333
これを、配列に代入して表示するんでしょ?
bash$ IFS="
> "
bash$ DATA=(`cat x.txt`)
bash$ echo ${DATA[0]}
1111111111
こんな感じで、出そうなもんだけど、いかが?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【マクロ】フォルダにファイルが1つも無い時に、ファイルがありませんとメッセージを表示する 4 2022/08/28 08:48
- その他(開発・運用・管理) WindowsからSSHでサーバーにあるファイルをダウンロードできない…。 3 2022/04/24 11:08
- Excel(エクセル) マクロのコードを、少しでも削って短くしたい 3 2022/08/30 07:46
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- Excel(エクセル) excelで検索した商品の画像(ネットワーク上の)を表示させたい。 3 2023/06/28 00:32
- UNIX・Linux Linuxについて質問です。 以下のhistoryの出力結果から、sedコマンドのファイル名tmp1 1 2023/02/03 20:11
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- その他(プログラミング・Web制作) ログインシェル時のSHELL環境変数 1 2022/06/08 19:21
- 物理学 テンソル ひずみのマトリクス表記 3 2022/04/23 21:22
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチファイル 文字列にスペ...
-
バッチ終了時にDOS窓を閉じるコ...
-
コマンドプロンプトをクリック...
-
ftpコマンドを実行すると「425 ...
-
バッチファイルを使ってテキス...
-
Pythonで単純にファイルを結合...
-
make test って何をするための...
-
findstrでヒットした1行前の文...
-
コマンドプロンプトのバッチで...
-
xCopyコマンドでネットワークご...
-
VB.NETでのDOSコマンドを実行に...
-
DOSコマンドで指定日数よりも過...
-
FTPサーバ(ACOS)にあるファイル...
-
バッチファイルで文字列の検索...
-
AccessVBAで実行時間を指定する...
-
コマンドプロンプトのFTPコマン...
-
FTPの連続実行でフリーズする
-
2つ目の「pause」は無効?
-
リネームバッチ
-
ftpコマンド出力結果の取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチ終了時にDOS窓を閉じるコ...
-
バッチファイル 文字列にスペ...
-
make test って何をするための...
-
コマンドプロンプトをクリック...
-
ショートカットをデスクトップ...
-
バッチファイルを使ってテキス...
-
シェルの「:コマンドが見つか...
-
ftpコマンドを実行すると「425 ...
-
コンピュータ名をファイル名に...
-
バッチコマンドのIF文(条件...
-
SSH接続でwindowsサーバのコマ...
-
コマンドプロンプトで、特定の...
-
findstrでヒットした1行前の文...
-
FTP送信エラーの検知について
-
DOSコマンドで指定日数よりも過...
-
ftpコマンド出力結果の取得
-
Pythonで単純にファイルを結合...
-
AccessVBAで実行時間を指定する...
-
2つ目の「pause」は無効?
-
コマンドプロンプトを最小化し...
おすすめ情報