【发布时间】: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=~/repodir或export repo_path=~/"repodir"。顺便说一句,test是一个相当重要的内置 shell 命令的名称,用执行其他操作的函数覆盖它可能会导致非常奇怪的问题——我会使用不同的名称。 -
@GordonDavisson 是的,我知道,这只是为了测试目的 :) 替换 ~ 就像一个魅力!我知道这会很愚蠢...谢谢!