【问题标题】:Bash: Using Number of Lines in File in VariableBash:在变量中使用文件中的行数
【发布时间】:2015-03-26 17:43:50
【问题描述】:

我正在尝试从文件中提取行数,然后在变量中使用它。但是,它不断传递文件名,而不是行数。我通读了this question,但示例不起作用。

for i in $BASE/$TEMPLATE_DIR-$i$PRUNING_METHOD/*.txt
    do
        NUM_LINES=$(wc -l < $i)
        echo $NUM_LINES
        UPLOAD_CMD="sh sshpass_setup_verification.sh $EXP_ID-$i$PRUNING_METHOD__$NUM_LINES__features";
        echo "$UPLOAD_CMD"
        break 1;
    done

打印:

15 #the correct number of lines
sh sshpass_setup_verification.sh di-60sec-max/TemplateUser1.txt #where TemplateUser1.txt is the name of the file

应该打印:

15
sh sshpass_setup_verification.sh di-60sec-max__15__features

【问题讨论】:

  • 在您的 echo 语句中使用 ${NUM_LINES}(带有花括号)。否则,Bash 认为您的意思是名为 NUM_LINES__features 的变量,它没有设置并扩展为空。
  • ....${EXP_ID}-${i}${PRUNING_METHOD}__${NUM_LINES}__features。由于_ 是变量名中的有效字符,而您实际上并没有定义NUM_LINES__features 变量...只需养成始终使用大括号的习惯(并且始终引用,并且...).. .
  • 现在在其中添加了一个空格,如下所示:sh sshpass_setup_verification.sh di-60sec-best-test2-1-max__ 822__features。知道为什么吗?

标签: bash wc


【解决方案1】:

人们在 cmets 中告诉您的内容摘要:

for i in "${BASE}/${TEMPLATE_DIR}-${i}${PRUNING_METHOD}"/*.txt
do
    num_lines=$(wc -l < "$i")
    echo "$num_lines"
    upload_cmd="sh sshpass_setup_verification.sh ${EXP_ID}-${i}${PRUNING_METHOD}__${num_lines}__features"
    echo "$upload_cmd"
    break
done

这里的关键是在参数扩展和花括号周围使用双引号来消除歧义,以消除诸如_ 之类的字符可以解释为变量名的一部分但不应解释为变量名的一部分的情况。我已经在几个不是严格需要但没有害处的地方添加了它们。

我还将您的变量名称更改为小写。有一天,当您决定使用一个名为 PATH 的变量并且突然您的所有命令都停止工作时,这将为您提供帮助。

【讨论】:

  • 这仍在num_lines值之前添加空格
  • @Adam_G 我忘记在命令中将NUM_LINES 更改为num_lines(但不确定这是问题所在)。肯定是那个前面有空格的变量吗? declare -p num_lines 告诉你什么?
  • 很奇怪。它有一个巨大的空间:declare -- num_lines=" 822"。知道为什么要添加它,以及如何修剪它吗?
  • @Adam_G 我不确定它来自哪里,但有很多方法可以将其删除:stackoverflow.com/q/369758/2088135 - 在这种情况下,如果您想删除所有空格字符,您可以使用${num_lines// /}
  • 谢谢!做到了。你能解释一下双反斜杠和单反斜杠的作用吗?
猜你喜欢
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多