こんにちは。何度もすみません。また質問させて下さい。
RedHat7.0でシェルスクリプトを作成しているのですが、
初心者の為(Linux自体よくわかってません)悪戦苦闘中です。

今回つまづいたのは、

#!/bin/bash

FName=/home/my/aaa.txt
read str1 str2 str3 <$FName

とした時、まず、実行している場所が
/tmp
な為、FNameに/home/myとやるとファイルがありません、
と言われてしまいます。
../home/myでもだめなんですね~・・・どうしてでしょう・・・。

もうひとつ、
aaa.txtの中身に記述されているデータが、空白区切りの時は
うまくstr1 str2 str3に値が入ってくれるのですが、
カンマ区切りデータが入っていると値が入ってくれません。
自分なりに調べて-dを使うと出来るっぽい所までは
わかったのですが、具体的な使い方がいまいちわからないのです。
read str1 str2 str3 <$FName -d,
なんて書いてみたのですが・・・全然だめのようです。
なかなか良いサンプルコードが見つからなくて・・・。

すみませんが、アドバイスいただけたら、と思います。
宜しくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

またお会いしましたね。

では、早速。

> FNameに/home/myとやるとファイルがありません

フルパスで書いているのですから、実行している位置には関係ないです。
怪しいのは、読み込もうとしているファイル周りの権限。

/home/my/aaa.txt から中身を読み込む為には、実行ユーザが

・aaa.txt に対して読み込み権限を持っていること
・/home 及び /home/my ディレクトリに実行権限を持っていること

が必要です。


> カンマ区切りデータが入っていると値が入ってくれません

これについては、こんな感じでできます。

IFS=,
read str1 str2 str3 < $FName

bash の man でシェル変数のところに記述がありますので、詳細はそちらを
どうぞ。


> なかなか良いサンプルコードが見つからなくて・・・

一番のお手本は、起動スクリプトですよ。/etc/rc0.d とかの下にあるやつ。
絶対動くって保証もあるし。
    • good
    • 0
この回答へのお礼

a-kumaさんおはようございます。回答ありがとうございます。
今教えていただいた通りやってみたら動きました!
なるほど、ディレクトリに実行権限が無いとだめなんですね~~
難しいです~~。

カンマ区切りのも無事できました。
manは、読んでも難しくてさっぱりわからないんですよね・・・。
でもがんばって読んで勉強します。
今回のスクリプトはとりあえずこれで動きそうです。
本当に助かりました。どうもありがとうございます。

なるほど、起動スクリプトですか・・・
ああいうのをさらっと書けるようになるといいんですけど。。
かんばります!!

お礼日時:2001/08/08 09:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QVBAでタブ区切りファイルを列区切りにしたい

VBAで秀丸のテキストファイルをエクセルに読み込むとき、タブ区切りがエクセルでは連続した文字列になってしまいます。
これを列に区切って読み込みたいのですがどうしたらいいですか?

読み込むプログラムは、「Excelでお仕事!」のサンプルを使ったもので、ファイルを開く画面から選択する形です。コードは下記です。

' Applicationオブジェクト取得
Set xlAPP = Application ' (1)
' 「ファイルを開く」のフォームでファイル名の指定を受ける
xlAPP.StatusBar = "読み込むファイル名を指定して下さい。"
strFILENAME = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, _
Title:=cnsTITLE) ' (2)
' キャンセルされた場合は以降の処理は行なわない
If StrConv(strFILENAME, vbUpperCase) = "FALSE" Then Exit Sub ' (3)

' FreeFile値の取得(以降この値で入出力する)
intFF = FreeFile ' (4)
' 指定ファイルをOPEN(入力モード)
Open strFILENAME For Input As #intFF ' (5)

VBAで秀丸のテキストファイルをエクセルに読み込むとき、タブ区切りがエクセルでは連続した文字列になってしまいます。
これを列に区切って読み込みたいのですがどうしたらいいですか?

読み込むプログラムは、「Excelでお仕事!」のサンプルを使ったもので、ファイルを開く画面から選択する形です。コードは下記です。

' Applicationオブジェクト取得
Set xlAPP = Application ' (1)
' 「ファイルを開く」のフォームでファイル名の指定を受ける...続きを読む

Aベストアンサー

Sub の上に
Option Base 1
を追加。

Dim v
を宣言して

' 行を加算しA列にレコード内容を表示(先頭は2行目)
v = Split(strREC, vbTab)
GYO = GYO + 1
Cells(GYO, 1).Resize(, UBound(v) + 1).Value = v
に変更

ではどうでしょうか?

QUNIXシェルプログラミング ${@+"$@"}

「入門UNIXシェルプログラミング」という書籍に以下のような記述がありました。
どうも矛盾しているようで、理解できないのですが、シェルに詳しい方、解説をお願いできないでしょうか。よろしくお願い致します。

以下の文章が、もし「"$@"は""に、"$*"はNULLに置き換わります。」なら理解できるんですが・・・
誤植では、ないですよね…?

(以下引用)--------------------------------------------------------
$*をダブルクウォートで囲むと、1つの文字列になります。$@をダブルクォートで囲むと、それぞれ別々の文字列であると解釈されます。
それならいつでも、「"$@"」を使えば混乱がなくていいじゃないか、と思われるかもしれません。
ところがこれにはこれで落とし穴はあるのです。
位置パラメタに何の値もセットされていない場合、つまり、渡すべきパラメタが何もない状態のときには、"$@"はヌルに、"$*"は""に置き換わります。
ヌルの場合はパラメタとして処理しませんが、""は「何もないパラメタがある」として処理します。どちらを選択しなければならないかは、状況によって判断しなくてはなりません。
一般的には、前節で説明した${variable+value}の形式を使うのが最適でしょう。
${@+"$@"}
こう書くことで、位置パラメタに何もセットされていない場合には何もしない、という条件を作れます。

「入門UNIXシェルプログラミング」という書籍に以下のような記述がありました。
どうも矛盾しているようで、理解できないのですが、シェルに詳しい方、解説をお願いできないでしょうか。よろしくお願い致します。

以下の文章が、もし「"$@"は""に、"$*"はNULLに置き換わります。」なら理解できるんですが・・・
誤植では、ないですよね…?

(以下引用)--------------------------------------------------------
$*をダブルクウォートで囲むと、1つの文字列になります。$@をダブルクォートで囲むと、それ...続きを読む

Aベストアンサー

この記述は、パラメータ無しの時の "$@" の展開が昔と今では違っていることを踏まえて無いので一部意味不明になってます。

例えば、引数が、a "b c" d という3つの文字列のとき、"$1" は a, "$2" は "b c", "$3" は d になります。
"$@" は、a "b c" d の3つの文字列になり、"$*" は、"a b c d" と1つの文字列になります。引用符で囲まず、単に $@ や $* と書くと、a b c d という4つの文字列になります。

で、引数の個数がゼロのとき、"$*" は "" (空文字列) という1つの文字列、つまり "$*" は引数の個数に関係なく常に1つの文字列になります。これに対して、"$@" は「空」つまりゼロ個の文字列に展開されます。

つまり、シェルスクリプトの引数をできるだけそのまま子供のコマンドに伝えるときには、"$@" を使えばいい訳です。これで、引数の個数がゼロ個であれ、たくさんであれ、引数が引用符で囲まれていても常に、親スクリプトの引数と同じ物、同じ個数が子コマンドに渡ります。

ところが、昔の/bin/shでは、引数がゼロ個の時の "$@" は空でなく "" という1つの空文字列に展開されるという仕様でした。このため、「できるだけそのまま子供のコマンドに伝える」という場合には、${@+"$@"} と書く必要がありました。現在のほとんどのshでは、"$@" でOKです。もしかすると古い仕様のままのshがあるかもしれませんが。

この記述は、パラメータ無しの時の "$@" の展開が昔と今では違っていることを踏まえて無いので一部意味不明になってます。

例えば、引数が、a "b c" d という3つの文字列のとき、"$1" は a, "$2" は "b c", "$3" は d になります。
"$@" は、a "b c" d の3つの文字列になり、"$*" は、"a b c d" と1つの文字列になります。引用符で囲まず、単に $@ や $* と書くと、a b c d という4つの文字列になります。

で、引数の個数がゼロのとき、"$*" は "" (空文字列) という1つの文字列、つまり "$*" は引数の個数...続きを読む

Qawkで複数ファイルをよんで$1$2と参照できるでしょうか?

awkで複数ファイルをよみこんでファイル1の$1ファイル2の$2と参照したりできないでしょうか?

Aベストアンサー

>この場合file1とfile2のデリミタを指定するには

デリミタが同じ","の場合
gawk -F, '{A=$1;getline < "file2";print A,$2}' file1

file1が","で、file2が" "の場合
gawk -F, '{A=$1;FS=" ";getline < "file2";print A,$2;FS=","}' file1
(行が読まれる時点でのFSの値で区切られます)

Q${parameter:-word} と ${parameter:=word} の違い

bashのパラメータ展開で

${parameter:-word} と ${parameter:=word}

の違いが何なのかよく分らないのですが、何が違うのでしょうか?

http://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html

Aベストアンサー

 :-の方は、parameterの値が変わりません。:=は変わります。どちらもparameterに既に値が入っている場合は何も起こりません。
 別の言い方をすると、:=の方はこの後bashが(子プロセスとして)起動するプロセスの環境変数にも$parameterがwordになりますし、:-はなりません。:=は何らかのプログラムを起動するスクリプト内で空っぽならデフォルト値を設定するというような用途に使用します。
 以下、bashですけど$が出てきまくると紛らわしいのでプロンプトを%とします。

% echo ${SAMURAI:=LAST}
LAST
% echo ${DORA:-YAKI}
YAKI
% echo $SAMURAI
LAST ←さっきのでSAMURAIにLASTが代入された
% echo $DORA
   ←さっきのでDORAにYAKIが代入されていない
%

Qcat `find ./` > for_print.txt にファイル名を入れたい!

カレントディレクトリ以下のファイルを連結したいのですが、
cat `find ./` > for_print.txt
に「ファイル名」と、
あと、「区切り」がわかるように
********************************
を入れたいのですが、
どうしたら良いでしょうか?

Aベストアンサー

セパレータの形式にこだわらないのであれば、
more `find ./` > for_print.txt
とか、
tail +0 `find ./` > for_print.txt
とか。


人気Q&Aランキング

おすすめ情報