bash - 带有“路径必须在表达式之前”输出的 Bash 脚本
问题描述
我正在尝试使用以下 bash 脚本查找所有具有 BOM 的 SQL 文件:
#!/bin/bash
set -x
printf '\nStart!\n'
caminho="$PWD"
parametros="-type f -name "*.sql""
$(find ${caminho} ${parametros} -exec grep -l $'\xEF\xBB\xBF' {} \;)
但我总是得到这个输出:
find /home/pablo/SQL -name ComBOM.sql ComVirgula.sql SemBOM.sql -exec grep -l $\xEF\xBB\xBF {} ;
find: paths must precede expression: `ComVirgula.sql'
find: possible unquoted pattern after predicate `-name'?
关于这个问题有很多问题,通过在 上添加双引号解决了这些问题,-name
但这对我不起作用。而这也是男人说的一样。
解决方案
在用相同类型的引号字符引用的字符串中添加一对未转义的(因此,语法)引号根本没有任何作用,因为这些引号只是相互抵消。然而,如果您确实对引号进行了转义,它们将在扩展时被视为数据而不是语法,因此代码仍然不会按预期运行,但会出现不同的错误(BashFAQ #50会详细介绍这种情况)。
使用一个数组,而不是一个字符串,这样你就可以通过完全引用的方式传递你的参数,而不会出现不必要的通配符。
代替:
parametros="-type f -name "*.sql""
...改为使用:
parametros=( -type f -name "*.sql" )
然后:
find "$PWD" "${parametros[@]}" -exec grep -l $'\xEF\xBB\xBF' {} +
推荐阅读
- string - Dart - 如何忽略字符串中的 \ 运算符
- r - R - 在 dplyr 管道中将文本添加到矢量元素的优雅方式?
- gradle - Gradle Spotbugs 插件
- vim - 点可重复映射从正常模式插入空格并沿移动光标
- python - 如何使用 BeautifulSoup 只选择第 n 个(第 42 个)`p` 标签?
- python - Jupyter 笔记本中的 FileUpload 小部件 - 如何访问上传的文件
- c - 这只能通过循环来解决吗?
- python - 如何在熊猫 DataFrame 中允许重复的列名
- reactjs - 反应免责声明页面
- keras - Resnet 模型参数