【问题标题】:command not found in awk sentence在 awk 语句中找不到命令
【发布时间】:2020-10-16 01:01:01
【问题描述】:

我有这个 awk 的问题,它可以工作,但我得到命令未找到错误

for line in $(cat ${FILE_LIST_PROCES}); do 
    
    ARCHIVO=$line
    echo "[`date '+DATE: %m/%d/%y %H:%M:%S'`] - Validando script: "$ARCHIVO
    if [ ! -f $ARCHIVO ]; then
            echo "[`date '+DATE: %m/%d/%y %H:%M:%S'`] - ERROR -"
        exit ${ARCHIVO_NO_ENCONTRADO}
    else
        `gawk '{
            if (/GRANT/||/REVOKE/) 
                if (/EXECUTE/||/REFERENCES/||/TRIGGER/||/ALL PRIVILEGES/) 
                    print "1";
                else{
                    I=0;
                    while (I<=NF){
                        if ($I == "TO")
                            if ($++I !~ /^[^uU][0-9]{6};?$/)    
                                print "1";
                        I++
                    }
                }
            }' "$ARCHIVO"`
            if [[ $? -eq 0 ]];then
                $ARCHIVO >> $FILE_LIST_TMP  
            else 
                echo "[`date '+DATE: %m/%d/%y %H:%M:%S'`] - ERROR - "
                mv $ARCHIVO $FILE_ERRORES
            fi                         
    fi
done

当我回显 1 时出现以下错误,我不明白是什么问题

./build.sh: line 80: 1: command not found

【问题讨论】:

标签: shell awk


【解决方案1】:

反引号是Command Substitution——反引号的内容在子shell中执行,shell用输出替换命令替换。这就是为什么echo "Right now it is $(date)" 可以按预期工作的原因。

如果你这样做:

echo before
`date`
echo after

然后,在命令替换之后,shell 会尝试运行这个:

echo before
Thu Jun 25 10:30:12 EDT 2020
echo after

您会看到一些错误,例如 Thu: command not found

TL;DR

您不会在每个外部命令周围加上反引号。


另外,更喜欢$(...) 形式的命令替换——它更容易查看和嵌套。

【讨论】:

  • 我不完全理解你的答案我在 gawk 部分之后得到了错误
  • 那个 gawk 命令的输出是什么?如果您尝试将该输出作为 bash 命令执行会发生什么?
  • 输出为 1,它在命令行中运行良好,但它是我添加的唯一内容(也是 if 跟随它们)并且错误与回显结果一起出现,所以 1 或其他我放回声
  • 想想你为什么用反引号包围 gawk 命令。
  • 我尝试使用 $(...) 仍然有同样的错误:/
【解决方案2】:

这会以某种方式解决它:

 for line in $(cat ${FILE_LIST_PROCES}); do 
        
        ARCHIVO=$line
        echo "[`date '+DATE: %m/%d/%y %H:%M:%S'`] - Validando script: "$ARCHIVO
        if [ ! -f $ARCHIVO ]; then
                echo "[date '+DATE: %m/%d/%y %H:%M:%S'] - ERROR - archivo " ${ARCHIVO} " no encontrado"
            exit ${ARCHIVO_NO_ENCONTRADO}
        else
            iResult=`gawk '{
                if (/GRANT/||/REVOKE/) 
                    if (/EXECUTE/||/REFERENCES/||/TRIGGER/||/ALL PRIVILEGES/) 
                        print "1";
                    else{
                        I=0;
                        while (I<=NF){
                            if ($I == "TO")
                                if ($++I !~ /^[^uU][0-9]{6};?$/)    
                                    print "1";
                            I++
                        }
                    }
                }' "$ARCHIVO"`
                for i in $iResult
                do  
                    if [ $i -ne 0 ]; then
                    echo "[`date '+DATE: %m/%d/%y %H:%M:%S'`] - ERROR - Archivo con sentencia erronea"
                    exit ${ARCHIVO_NO_ENCONTRADO}
                    fi
                done                    
        fi
    done

【讨论】:

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