この質問は私に関連しています。前の質問。
これは次の出力ですtree
。
[xyz@localhost Semester1]$ tree
.
├── Eng
│ ├── credits
│ ├── links
│ └── notes
├── IT
│ ├── credits
│ ├── links
│ └── notes
├── IT_workshop
│ ├── credits
│ ├── links
│ └── notes
├── LA
│ ├── credits
│ ├── links
│ └── notes
├── OS
│ ├── credits
│ ├── links
│ └── notes
├── OS_lab
│ ├── credits
│ ├── links
│ └── notes
├── Psy
│ ├── credits
│ ├── links
│ └── notes
├── Python
│ ├── credits
│ ├── links
│ └── notes
└── Python_lab
├── credits
├── links
└── notes
9 directories, 27 files
さて、そのフォルダのクレジットファイル内の各コースで使用されているクレジットの数について言及したいと思いますcat
。
たとえば、コースごとのクレジット数は次のとおりです。
コース名 | 生産スタッフ |
---|---|
インゲ | 2 |
ロサンゼルス | サム |
Python | サム |
オペレーティングシステム | サム |
それ | サム |
IT_ワークショップ | 1 |
Python研究室 | 1 |
オペレーティングシステム研究室 | 1 |
心理学 | 2 |
Eng/credits にクレジットの詳細を追加するには、次のコマンドを実行する必要があります。
cat >> Eng/credits
クレジット数(例:2)を入力し、Ctrl+を押しますD。
残りの8つのファイルに対しても同じ手順を実行する必要があります。これは面倒な作業のようです。一度にこれをすべて行う方法はありますかcat
?
Bashを知っている何人かの友達と話をしましたが、私の場合はecho
orを使う方が良いと思いましたprintf
。なぜこれが起こるのですか?
私はこれをしようとしています:
- Eng/creditsファイルに数字2を記録したいと思います。
- LA /クレジットファイルに数字3を記録したいです。
- Python / creditsファイルに数字3を書きたいです。
- OS/クレジットファイルに数字3を記録したいです。
- IT /クレジットファイルに数字3を記録したいです。
- IT_workshop/creditsファイルに数字1を書きたいです。
- Python_lab/creditsファイルに数字1を書きたいです。
- OS_lab/creditsファイルに数字1を書きたいです。
- Psy / creditsファイルに数字2を書きたいです。
echo {2,3,3,3,3,1,1,1,2} >> {Eng/credits,LA/credits,Python/credits,OS/credits,IT/credits,IT_workshop/credits,Python_lab/credits,OS_lab/credits,Psy/credits}
しかし、期待どおりに動作しません。
bash: {Eng/credits,LA/credits,Python/credits,OS/credits,IT/credits,IT_workshop/credits,Python_lab/credits,OS_lab/credits,Psy/credits}: ambiguous redirect
答え1
Catはファイル全体を出力するために使用されます。オペランド(オプションではない引数)はファイルです。これにより、cat >> foo
stdoutファイルをfoo
。
echoとprintfはすぐにデータを取得します。
echo 2 >> foo
...ファイルに2を入れますfoo
。
Printf は、オブジェクトに書式を追加、標準化し、不明なデータに直面した場合に、潜在的により安全な方法を提供します。
答え2
質問に示されている手動の方法よりも簡単な方法では、catを使用してこれを行うことはできません。この試み:
while read course credit; do
echo $credit >> $course/credits
done <<EOF
Eng 2
LA 3
Python 3
OS 3
IT 3
IT_workshop 1
Python_lab 1
OS_lab 1
Psy 2
EOF
~からバッシュのマニュアルページ:
read
[-ers]
[-a aname]
[-d delim]
[-i text]
[-n nchars]
[-N nchars]
[-p prompt]
[-t timeout]
[-u fd]
[name ...]
標準入力またはファイル記述子から1行を読む
fd
パラメータとして提供-u
上記のように単語で区切られたオプション噴射、最初の単語が最初の単語に割り当てられます。name
、第2ワードから第2ワードへname
、等。名前よりも単語が多い場合、残りの単語と中間区切り文字は最後の単語に割り当てられます。name
。入力ストリームから名前より少ない単語を読み取る場合、残りの名前にはヌル値が割り当てられます。文字IFS
拡張のためにシェルを使用して行を単語に分割するためにも同じ規則を使用します(上記のように)。 噴射)。バックスラッシュ文字(\
)は、次の文字の読み取りと行の連続の特別な意味を削除するために使用できます。オプションが提供されている場合は、次の意味があります
。︙
このread course credit
コマンドは、各行の最初の単語を変数に割り当て、次に行の残りのcourse
部分(この場合は数字)を割り当てますcredit
。
また、マニュアルページから:
ここにファイル
このタイプのリダイレクトは、行に次の項目のみが含まれるまで、現在のソースから入力を読み取るようにシェルに指示します。
delimiter
(末尾の空白なし)が表示されます。その時点まで読んだすべての行は、標準入力(またはファイル記述子)として使用されます。n
もしn
指定)をコマンドとして使用します。この文書の形式は次のとおりです。
[N]<<[-]言葉 ここのドキュメント 区切り記号
この場合、「word」と「delimiter」はEOF
「document here」がデータです。<<EOF
すべてをデータを含むファイルに置き換え、ここから標準入力をリダイレクトできます。<data.txt