首页 > 解决方案 > 带有“路径必须在表达式之前”输出的 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但这对我不起作用。而这也是男人说的一样。

标签: bashshell

解决方案


在用相同类型的引号字符引用的字符串中添加一对未转义的(因此,语法)引号根本没有任何作用,因为这些引号只是相互抵消。然而,如果您确实对引号进行了转义,它们将在扩展时被视为数据而不是语法,因此代码仍然不会按预期运行,但会出现不同的错误(BashFAQ #50会详细介绍这种情况)。


使用一个数组,而不是一个字符串,这样你就可以通过完全引用的方式传递你的参数,而不会出现不必要的通配符。

代替:

parametros="-type f -name "*.sql""

...改为使用:

parametros=( -type f -name "*.sql" )

然后:

find "$PWD" "${parametros[@]}" -exec grep -l $'\xEF\xBB\xBF' {} +

推荐阅读