问题:
文件名:Celebs
文件内:
Beyonce
Brittney
Kevin
George
我必须使用read
和while
命令创建代码。这是我到目前为止所拥有的,但我认为这是不正确的,因为它不会在我的 shell 脚本中运行。
我还被告知文件名并不总是如此,Names
而且我不知道如何在代码中输入任何随机文件。我还必须使用未知的文件名以及文件内人员的姓名,创建一个数组并将其打印在终端中。
所以我还需要打印出来。
list= find -name "Celebs" -type f #if its an unknown file name this method won't work
start=0 #position of the empty array
declare -a People
while read -r line
do
People[$start]=$line #lines read to be stored in the array
((start++))
done<$list
答案1
假设:
- 这是一个
bash
脚本。 - 正在标准输入上读取数据。
- 每行输入都存储在一个数组中,然后在读取所有输入后显示。
从标准输入获取数据摆脱了不知道数据最初存储在哪里的问题。它使脚本的用户可以自由地从命令中输入数据,或者简单地重定向来自文件的输入。
解决方案:
#!/bin/bash
# 'names' is an array, empty from the start
declare -a names=()
while read name; do
# Append the name to the end of the array
names+=( "$name" )
done
# Output all names with each being prepended by "Name: "
printf 'Name: %s\n' "${names[@]}"
既然我们正在读名字,我选择不是-r
将开关与 一起使用read
。据我所知,没有任何名称包含反斜杠......
我们可以使用运算符将值附加到数组中+=
。
不需要循环来执行输出,因为printf
将“循环”其输入并将其格式应用于数组的每个元素,可以说1。
使用问题中的数据对其进行测试:
bash-4.4$ bash script <testdata
Name: Beyonce
Name: Brittney
Name: Kevin
Name: George
1 printf
不知道数组,但它将使用它获取的每一行输入并根据格式化字符串对其进行格式化。变量扩展${names[@]}
将导致 的多行输入printf
。