首页 > 解决方案 > 带有包含变量的 grep 的 Bash 循环

问题描述

我有一个函数应该遍历数组中的每个客户并对该目录执行 grep。

test(){
  set -x;
  export customers=( customer1 customer2 customer3 );
  export repo_path="~/repodir";
  export output_path='/tmp';

  for i in "${customers[@]}"
  do
    echo "${repo_path}/PEC/repo-${i}/build.yml"
    grep 'link: ' $repo_path/PEC/repo-$i/build.yml | cut -d '/' -f 2 | sed 's/.git//g'
  done | sort -u > ${output_path}/repos.txt
  
  echo "${output_path}/repos.txt";
}

出于某种原因,我收到以下错误消息:

grep:~/repodir/PEC/customer1/build.yml:没有这样的文件或目录

但是当我检查完全相同的路径时,我可以看到并读取文件......第一个 echo 命令似乎也没有执行。当我用它替换grep 'link: ' $repo_path/PEC/repo-$i/build.yml时,grep 'link: ' ~/repodir/PEC/repo-$i/build.yml它确实有效。

我尝试了各种方法来定义变量${repo_path},例如添加不同类型的引号,......所以我基本上不知道我能做些什么来让它工作。

标签: linuxbashshell

解决方案


$HOME是一个环境变量,设置为包含当前用户的主文件夹。终端会话应始终可以访问此环境变量,除非已将其删除。 ~是外壳扩展符号,是在执行实际命令之前处理的符号之一。~ 单独扩展为 $HOME 的值。

你的代码, export repo_path="~/repodir";

~如果您想~尝试转义字符,则它在字符串中并且可能不会被处理。为了便于阅读,使用$HOME变量会更简单。


推荐阅读