【问题标题】:Bash loop with grep containing variable [duplicate]带有包含变量的grep的Bash循环[重复]
【发布时间】:2021-07-12 09:43:38
【问题描述】:

我有一个函数,它应该遍历数组中的每个客户并执行 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},添加不同类型的引号,......所以我基本上不知道我能做些什么来让它工作。

【问题讨论】:

  • "~/repodir" 更改为"$HOME/repodir" ~ 不会在引号内展开。
  • $repo_path 没有大括号呢?
  • 您还可以将~ 移到引号之外:export repo_path=~/repodirexport repo_path=~/"repodir"。顺便说一句,test 是一个相当重要的内置 shell 命令的名称,用执行其他操作的函数覆盖它可能会导致非常奇怪的问题——我会使用不同的名称。
  • @GordonDavisson 是的,我知道,这只是为了测试目的 :) 替换 ~ 就像一个魅力!我知道这会很愚蠢...谢谢!

标签: linux bash shell


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    相关资源
    最近更新 更多