【问题标题】:Using a variable in shell script command [duplicate]在shell脚本命令中使用变量[重复]
【发布时间】:2021-10-15 15:38:15
【问题描述】:

我在 .sh 中使用 cat 命令中的变量时遇到问题,它没有使用它,我不明白为什么!

我想计算多个同名文件中的线数,但过去几天的日期除外:

something_example_20211015_somethingelse.txt something_example_20211014_somethingelse.txt ...

这是我写的:

#!/bin/bash

for i in {1..7}; do
    #Get the date of the seven days before inside dday var
    dday=date +%Y%m%d -d ''"$i"' days ago'
    number_ligne=0
    #Count the number of line
    number_ligne=cat /home/me/*exemple_*$dday* | wc -l
    echo $dday
    echo $number_ligne
done

输出看起来现在正在使用 dday 并执行此操作:

cat /home/me/*exemple_**

你有什么想法

谢谢!

【问题讨论】:

  • 你应该在dday=date +%Y%m%d -d ''"$i"' days ago'这一行收到一条错误消息,类似于bash +%Y%m%d : command not found

标签: linux bash shell unix script


【解决方案1】:

要捕获命令的输出,您需要命令替换:

number_ligne=$(cat /home/me/*exemple_*$dday* | wc -l)
#            ~~                                     ~

【讨论】:

  • 您可能还想添加另一行:dday=date ... -> dday=$(date ...)
  • number_ligne="$(wc -l /home/me/*exemple_*"$dday"*)"(或者,如果它以某种方式保证匹配一个文件,那么number_ligne="$(wc -l < /home/me/*exemple_*"$dday"*)" 会阻止wc 打印出文件名。)
  • @AndrejPodzimek:这应该只是 IMO 的旁注,因为使用 cat 可能是不必要的,但这并没有错
  • @Maxxim 这取决于 wrong 的定义……附带说明的是,一个无用的额外过程非常昂贵,尤其是当类似的事情发生在循环中时。主要问题是如果没有set -o pipefail(或显式检查${PIPESTATUS[@]}),无用的管道(以cat 开头)可以隐藏文件访问错误:cat nonexistent | wc -l 返回零状态(成功),而wc -l nonexistentwc -l < nonexistent 都返回错误,它们应该如此。
  • @AndrejPodzimek:不起作用的意义上。 OP似乎是初学者。你说的是优化和原始代码范围之外的东西,更适合高级用户。
【解决方案2】:

另外,不要过度引用引号,造成不必要的混乱,避免UUoC

for i in {1..7}; do
  dday=$( date +%Y%m%d -d "$i days ago" )
  number_ligne=$( wc -l < /home/me/*exemple_*$dday* )
  echo "$dday: $number_ligne"
done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 2011-08-24
    • 1970-01-01
    相关资源
    最近更新 更多