linux - 带有包含变量的 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}
,例如添加不同类型的引号,......所以我基本上不知道我能做些什么来让它工作。
解决方案
$HOME
是一个环境变量,设置为包含当前用户的主文件夹。终端会话应始终可以访问此环境变量,除非已将其删除。
~
是外壳扩展符号,是在执行实际命令之前处理的符号之一。~ 单独扩展为 $HOME 的值。
你的代码,
export repo_path="~/repodir";
~
如果您想~
尝试转义字符,则它在字符串中并且可能不会被处理。为了便于阅读,使用$HOME
变量会更简单。
推荐阅读
- javascript - ReactJS - 重构后无法从单独的文件中加载值
- sql - SQL 使用多个变量的日期和 ID 计算每日增量
- angular - 调用指令时无法设置 2 位小数
- r - 缩小地块标题与地图的距离
- amazon-dynamodb - 如何在一次查询中使用扫描检索数据以在 dynamoDB 中构建直方图
- spring - 如何使用 MockMvc 作为 RequestBody 传递对象?
- ios - 来自 GitHub 的 SwipeNavigationController 框架如何实现
- python - 从请求的 iframe 中获取特定文件
- python - 运行烧瓶应用程序 kubernetes
- node.js - MERN Passport 反序列化在每个请求上调用两次