【问题标题】:Bash for loop parameter unexpected behaviour [duplicate]Bash for循环参数意外行为[重复]
【发布时间】:2014-04-25 04:44:35
【问题描述】:

我正在使用我创建的数字在 bash 中创建一个创建 histoplot 的程序。这些数字是这样存储的(其中第一个数字是文件的一行上有多少个单词,第二个数字是给定文件中一行上的这个单词数量出现了多少次。)

 1  1
 2  4
 3  1
 4  2

这应该产生:

 1  #
 2  ####
 3  #
 4  ##

但是我得到的输出是:

 1 #
 2 #
 3 #
 4 # 

但是 for 循环没有识别出我的变量“hashNo”是一个数字。

 #!/bin/bash
 if [ -e $f ] ; then
         while read line    
     do     
         lineAmnt=${line% *}
         hashNo=${line##* }
      #VVVV Problem is this line here VVVV 
             for i in {1..$hashNo} 
             #This line ^^^^^^^ the {1..$hashNo} 
             do
             hashes+="#"    
             done   
         printf "%4s" $lineAmnt 
         printf " $hashes\n"
         hashes=""  
     done < $1
 fi

如果我将 hashNo 替换为数字(例如 4 在我的输出中产生 4 个哈希),则代码可以工作,但它需要能够随每一行更改(文件中的所有行都不会包含相同数量的字符) .

感谢您的帮助:D

【问题讨论】:

  • 很多很多问题的重复。

标签: linux bash for-loop terminal


【解决方案1】:

bash 中的序列表达式必须由整数或字符组成,事先不进行参数替换。那是因为,根据bash doco:

扩展的顺序是:大括号扩展、波浪号扩展、参数、变量和算术扩展以及命令替换(以从左到右的方式完成)、分词和路径名扩展。

换句话说,大括号扩展(包括序列表达式形式)首先发生。

无论如何,这都需要作为一个函数来完成,这样它就可以在任何地方轻松完成,而且效率更高:

#!/bin/bash

hashes() {
    sz=$1
    while [[ $sz -ge 10 ]]; do
        printf "##########"
        ((sz -= 10))
    done
    while [[ $sz -gt 0 ]]; do
        printf "#"
        ((sz--))
    done
}

echo 1 "$(hashes 1)"
echo 2 "$(hashes 4)"
echo 3 "$(hashes 1)"
echo 4 "$(hashes 2)"

根据需要输出:

1 #
2 ####
3 #
4 ##

使用第一个循环(一次执行十个哈希)几乎肯定会比一次添加一个字符更有效,如果您愿意,可以在此之前执行一个大小为 50 的循环以提高效率如果您的值可以更大。

【讨论】:

  • 谢谢,信息量很大
【解决方案2】:

我在 for 循环中尝试了这个 for (( i=1; i&lt;=$hashNo; i++ )),它似乎正在工作

【讨论】:

    【解决方案3】:

    你的循环应该是

    for ((i=0; i<hashNo; i++))
    do
          hashes+="#"    
    done  
    

    您还可以通过使用eval 和命令替换$() 来坚持您的循环

    for i in $(eval echo {1..$hashNo})
    do
       hashes+="#"    
    done  
    

    【讨论】:

    • 我不知道你可以在 bash 中为循环做 c++ 样式:O
    • 这是 bash 中完全有效的 c 样式循环。您可以在这里看到 for..loop 的多种方式 thegeekstuff.com/2011/07/bash-for-loop-examples
    • 感谢您的帮助:)
    • @BarneyChambers 欢迎您。
    猜你喜欢
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2011-08-09
    • 2013-08-24
    相关资源
    最近更新 更多