这个问题和我的有点关系上一个问题。
这是以下的输出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 |
洛杉矶 | 3 |
Python | 3 |
操作系统 | 3 |
它 | 3 |
IT_workshop | 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/credits 文件中,我希望写入数字 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
来自bash 手册页:
read
[-ers]
[-a aname]
[-d delim]
[-i text]
[-n nchars]
[-N nchars]
[-p prompt]
[-t timeout]
[-u fd]
[name ...]
从标准输入或文件描述符读取一行
fd
作为参数提供给-u
选项,按照上面的描述分成单词分词,第一个单词被分配给第一个name
,第二个词到第二个词name
, 等等。如果单词数多于名称,则剩余的单词及其中间分隔符将分配给最后一个name
。如果从输入流中读取的单词少于名称,则其余名称将分配为空值。中的人物IFS
用于使用 shell 用于扩展的相同规则将行拆分为单词(如上所述 分词)。反斜杠字符 (\
) 可用于删除读取的下一个字符和行继续的任何特殊含义。选项(如果提供)具有以下含义:
︙
该read course credit
命令会将每行上的第一个单词分配给变量course
,然后该行的其余部分(在本例中为数字)分配给变量credit
。
也来自手册页:
这里的文件
这种类型的重定向指示 shell 从当前源读取输入,直到一行仅包含
delimiter
(没有尾随空白)可见。到该点读取的所有行都将用作标准输入(或文件描述符n
如果n
被指定)为一个命令。这里文档的格式是:
[n]<<[-]单词 此处文档 分隔符
在这种情况下,“单词”和“分隔符”是EOF
,“此处文档”是数据。您可以<<EOF
用包含数据的文件替换所有内容,并从中重定向标准输入;例如, <data.txt