Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 文件输入在while循环中被消耗_Bash_While Loop - Fatal编程技术网

Bash 文件输入在while循环中被消耗

Bash 文件输入在while循环中被消耗,bash,while-loop,Bash,While Loop,我正在读取一个查找文件,并对文件中的每一行执行一组操作。然而,while循环只读取文件中的第一行并退出。这是我目前的代码 sql_from_lkp $lookup function sql_from_lkp { lkp=$1 while read line; do sql_from_columns ${line} echo ${line} done < ${lkp} } function sql_from_columns {

我正在读取一个查找文件,并对文件中的每一行执行一组操作。然而,while循环只读取文件中的第一行并退出。这是我目前的代码

sql_from_lkp $lookup

function sql_from_lkp {
    lkp=$1
    while read line; do
        sql_from_columns ${line}
        echo ${line}
    done < ${lkp}
}

function sql_from_columns {
    table_name=$1
    table_column_info_file=${table_name}_columns
    line_count=`cat $table_info_file | wc -l`
    ....
}
sql\u from\u lkp$lookup
函数sql_from_lkp{
lkp=1美元
边读边做
sql_来自_列${line}
echo${line}
完成<${lkp}
}
函数sql\u from\u列{
表名称=$1
table_column_info_file=${table_name}\u columns
行_count=`cat$table_info_file | wc-l`
....
}
通过有选择地注释代码,我发现如果我注释
line\u count
行,while循环将遍历文件中的每一行,并且运行良好。因此,
cat
语句正在消耗输入


我检查了其他答案,了解到
ssh
通常使用
中的文件输入,而
如果不使用-n选项,则循环。但不知道如何解决这个问题。需要帮助。

您输入了一个变量名:
$table\u info\u file
应该是
$table\u column\u info\u file

如果你纠正了这一点,你的问题就会消失


通过引用一个不存在的变量,即输入错误的
$table\u info\u file
,您实际上是在
sql\u from\u columns()
中执行
cat | wc-l
(没有文件名参数传递给
cat
),这使得
cat
从stdin读取

因此,在读取了
while
循环中的第1行之后,
sql\u from\u columns()
中的
cat
命令将消耗所有剩余的输入(
<${lkp}
),这就是为什么
while
循环在第一次迭代后退出的原因


一般来说

  • 您应该对所有变量引用进行双引号引用,以免使其值受到限制

  • Bash不允许您在定义函数之前调用它们,所以正如您在问题中所提出的,您的代码根本无法工作

  • 虽然用于命令替换的传统
    `…`
    语法仍然受支持,但它已经得到了支持


  • 计算行数的一种更有效的方法是通过
    将输入文件传递到
    wc-l
    ,作为一种旁白:您应该对所有变量引用进行双引号引用,以避免将变量值进行分词和全局搜索;此外,Bash不允许在定义函数之前调用它们。乍一看,您似乎正在将
    line
    传递给
    sql\u from\u colums
    ,这需要一个
    table\u name
    作为输入?@David我基本上每行都有一个表。我对代码进行了重构,删除了很多细节,以使场景更容易出现。@Vinay:还建议使用一个工具,它可以帮助您非常容易地识别小错误。真不敢相信我错过了。查找此脚本比编写脚本本身需要更长的时间。感谢您指出这一点并提供最佳实践!
    function sql_from_lkp {
        lkp=$1
        while read line; do
            sql_from_columns "${line}"
            echo "${line}"
        done < "${lkp}"
    }
    
    function sql_from_columns {
        table_name=$1
        table_column_info_file=${table_name}_columns
        line_count=$(wc -l < "$table_column_info_file")
        # ...
    }
    
    sql_from_lkp "$lookup"