Bash 文件输入在while循环中被消耗
我正在读取一个查找文件,并对文件中的每一行执行一组操作。然而,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 {
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"