在参数中引用循环变量

在参数中引用循环变量

我有一个脚本(myscript.sh)循环,它grep在许多不同的文件中存储一些字符串,将它们存储在一个新文件中,然后cat将该文件的内容存储到终端:

for i in {1..201..5}; do
        grep "Pitch" filename-$i.log | cut -d" " -f25
done > pitch.txt
echo "========Pitch==========="
cat pitch.txt

这是我想从命令行执行的操作:

./myscript.sh filename-$i.log

然后运行 ​​myscript.sh,循环遍历i我在 myscript.sh 的参数中引用的变量。

我希望我已经正确解释了我的目标!

答案1

如果您想将不同文件名的基本部分作为第一个参数传递给脚本,请将循环更改为:

for i in {1..201..5}; do
        grep "Pitch" "${1}-${i}" | cut -d" " -f25
done > pitch.txt

(假设破折号始终存在,并且不作为参数的一部分传递,并且文件名的可变部分始终位于末尾)

答案2

目前尚不清楚您想要什么,但从我得到的情况来看,您有 6 个目录,但每个目录都有以类似方式命名的文件,末尾带有数字。然后你可以这样做:

for arg
do
   for i in {1..201..5}; do
      grep "Pitch" "$arg-$i" | cut -d" " -f25
   done > $arg/pitch.txt
   echo "========Pitch==========="
   cat $arg/pitch.txt
done

答案3

使用这个语法:

for ((i=0; i<=$1; i=(($i + 5)) ))
        grep "Pitch" filename-$i | cut -d" " -f25
done > pitch.txt
echo "========Pitch==========="
cat pitch.txt

答案4

这个bash函数应该可以工作:

foo() {
    searchstring="$1"
    shift 1
    echo "========${searchstring}===========" ; 
    grep --no-filename "${searchstring}" "$@" | \
    cut -d" " -f25 | tee "${searchstring,,}".txt 
    }

像这样调用:

foo Pitch filename-{1..201..5}

怎么运行的。由于grep允许从命令行使用多个文件名,并且bash允许在诸如 之类的代码中添加字符串前缀{1..10},因此无需通过for循环一次传递一个文件名。和cat>可以替换为单个tee

第一个参数foo是搜索字符串(例如“匹配"),shell 将其设置为 "1 美元“ - 被移动到临时变量$searchstring,然后”匹配“ 被删除shift 1,因此 ”$@" 仅包含文件名。

相关内容