質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Q&A

解決済

1回答

765閲覧

Linuxのシェルスクリプトについて

Momosuke-0123

総合スコア1

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

0グッド

1クリップ

投稿2022/03/17 09:04

現在、シェルスクリプトについて学習している者です。

コマンドと、そのコマンドを実行した際にログを吐き出すログファイル名を格納したテキストファイルを用意し、
それをwhile read lineで読み込んで処理する、といった内容の練習をしております。

例を挙げると、

ls -l,ls.log
pwd,pwd.log
history,his.log

といった3行のテキストファイル【test.txt】を用意し、
,を区切り文字にして前のコマンドを後ろのログファイルに吐き出すといった具合です。

現在思考しているコードとしては、

text1=$(awk -F ',' '{print $1}' /root/test.txt)
text2=$(awk -F ',' '{print $2}' /root/test.txt)
while read line
do
$text1 > $text2
done < /root/test.txt

になっています。
こちらだと、曖昧なリダイレクトであるとエラーを吐いてしまいます。

test.txtが1行のみの場合はこのコードで処理してくれているため、3行になったら何故エラーとなるのか、疑問点です。

ls -l,ls.log
というテキストファイル【test2.txt】を用意し、
text1=$(awk -F ',' '{print $1}' /root/test2.txt)
text2=$(awk -F ',' '{print $2}' /root/test2.txt)
while read line
do
$text1 > $text2
done < /root/test2.txt
を実行した際は想定通り動く、ということです……

ご教授いただけますと幸いです。
よろしくお願いいたします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

text1=$(awk -F ',' '{print $1}' /root/test.txt)

で、text1に何が入ると思っているのでしょうか?

元のテイストを残して書き換えると、

Bash

1while read line 2do 3 text1=$(echo $line | awk -F ',' '{print $1}' ) 4 text2=$(echo $line | awk -F ',' '{print $2}') 5 $text1 > $text2 6done < /root/test.txt

でしょうか。

シンプルに書くと、

sh

1while IFS=, read text1 text2 2do 3 $text1 > $text2 4done < /root/test.txt

投稿2022/03/17 09:25

otn

総合スコア84498

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Momosuke-0123

2022/03/17 09:58 編集

ご回答ありがとうございます。 while lineで1行ずつ読み込み、それをawkコマンドで分離して‥と思考したこと、 awk -F ',' '{print $1}' /root/test.txt のみでコマンド実行したところコマンドが表示されたことから、 text1にはコマンドそのものが格納されていると認識してしまっておりました。 text2にはログファイル名が入っている認識だったのですが曖昧なリダイレクトということで だいぶハマってしまいました。 いただいたコードで試しましたところ、想定していた通りの結果がでました。 ありがとうございました。精進します。
otn

2022/03/17 12:15

> while lineで1行ずつ読み込み、それをawkコマンドで分離して‥と思考したこと、 質問文のコードはそうなっていませんよね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問