Bash编程,读取值和文件名

时间:2014-10-02 23:46:43

标签: bash

好的,这就是我所拥有的:

#!/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状态。感谢任何帮助,谢谢社区。

2 个答案:

答案 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是参数$1readFile是参数$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