好的,这就是我所拥有的:
#!/bin/bash
read num
while read line
do
name=$line
echo "Text from file: $name"
for i in {0..num}; do
echo -e "\n"
done
done <$1
这个想法只是读取文件并在每行之间放置空格。用户输入他们想要在每一行之间添加的空格数(用&#34; num&#34;读入)。目标是能够输入控制台: ./fileName 3 readFile
它应该从readFile输出文本,每行之间有3个空格。相反,它给了我一个错误,上面写着&#34;第13:3行:没有这样的文件或目录&#34;。所以它不是以整数形式读取3,而是试图打开一个名为&#34; 3&#34;的文件。我该怎么做才能阻止这个?如果您有更好的解决方案,那么您的意见表示赞赏。我对bash有点新意,所以我很抱歉noob状态。感谢任何帮助,谢谢社区。 p>
答案 0 :(得分:0)
这应该适合你:
nSpaceFile() {
# Create the sed script we need to space the file out.
# One `G;` for each extra line we want to add.
declare sedscript=$(printf -- %*s $(($1 - 1)) | sed -e 's/ /G;/g');
# Run the sed script on the file(s) given.
sed "$sedscript" "${@:2}"
}
nSpaceFile 3 file
sed命令(以及许多其他sed one-liners)的说明here。
答案 1 :(得分:0)
引用man bash
:
To avoid conflicts with parameter expansion, the string ${ is not
considered eligible for brace expansion.
因此变量不能在括号扩展中扩展。对于这些情况,我使用seq
。您也可以使用eval
,但如果可以避免,则不建议这样做,因为它可以打开代码注入。
正如@BroSlow所提到的,当调用./fileName 3 readFile
时,3
是参数$1
而readFile
是参数$2
。
您可以像这样编写脚本:
while read -r line; do
if [[ $line ]]; then
echo "$line"
for i in $(seq $1); do
echo
done
fi
done < "$2"
但是在awk
循环上使用read
会更有效,特别是对于大型文件。
#!/usr/bin/env awk -f
NF {
print
for(i=1; i<=num;i++)
printf "\n"
}
使脚本可执行,您可以像这样调用它:
$ ./fileName.awk num=3 readFile