【问题标题】:BASH Script stop when I use "&"当我使用“&”时,BASH 脚本停止
【发布时间】:2022-06-10 20:24:50
【问题描述】:

我正在使用 bash 脚本,

当我运行它时

sh mysql-data-add.sh

效果很好,但是当我尝试在后台运行时,它会显示消息

sh mysql-data-add.sh &
-bash: A: command not found

我尝试在 mac 和 centos 服务器上运行。两者的结果相同。我也把它放在cron中,但到目前为止没有结果。但是,当我在没有“&”的情况下使用它时,脚本运行良好

脚本是

cd /home/domainsanalytics/db-new

unzip \*
gunzip \*

ls | grep csv > list.txt


while read -r line   ###### Loop 1 
do


while read -r line2  ###### Loop 1 
do


data=$(echo $line2 | awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", "", $i) } 1' | awk '{gsub(/\"/,"")};1' | tr -d \'\"   )


d2=$(echo $data | awk -F, '{print $2}')
d3=$(echo $data | awk -F, '{print $3}')
d4=$(echo $data | awk -F, '{print $4}')
d5=$(echo $data | awk -F, '{print $5}')
d1=$d2+$d3
d6=$(echo $data | awk -F, '{print $6}')
d7=$(echo $data | awk -F, '{print $7}')
d8=$(echo $data | awk -F, '{print $8}')
d9=$(echo $data | awk -F, '{print $9}')
d10=$(echo $data | awk -F, '{print $10}')
d11=$(echo $data | awk -F, '{print $11}')
d12=$(echo $data | awk -F, '{print $12}')
d13=$(echo $data | awk -F, '{print $13}')
d14=$(echo $data | awk -F, '{print $14}')
d15=$(echo $data | awk -F, '{print $15}')
d16=$(echo $data | awk -F, '{print $16}')
d17=$(echo $data | awk -F, '{print $17}')
d18=$(echo $data | awk -F, '{print $18}')
d19=$(echo $data | awk -F, '{print $19}')
d20=$(echo $data | awk -F, '{print $20}')
d21=$(echo $data | awk -F, '{print $21}')
d22=$(echo $data | awk -F, '{print $22}')
d23=$(echo $data | awk -F, '{print $23}')
d24=$(echo $data | awk -F, '{print $24}')
d25=$(echo $data | awk -F, '{print $25}')
d26=$(echo $data | awk -F, '{print $26}')
d27=$(echo $data | awk -F, '{print $27}')
d28=$(echo $data | awk -F, '{print $28}')
d29=$(echo $data | awk -F, '{print $29}')
d30=$(echo $data | awk -F, '{print $30}')
d31=$(echo $data | awk -F, '{print $31}')
d32=$(echo $data | awk -F, '{print $32}')
d33=$(echo $data | awk -F, '{print $33}')
d34=$(echo $data | awk -F, '{print $34}')
d35=$(echo $data | awk -F, '{print $35}')
d36=$(echo $data | awk -F, '{print $36}')
d37=$(echo $data | awk -F, '{print $37}')
d38=$(echo $data | awk -F, '{print $38}')
d39=$(echo $data | awk -F, '{print $39}')
d40=$(echo $data | awk -F, '{print $40}')
d41=$(echo $data | awk -F, '{print $41}')
d42=$(echo $data | awk -F, '{print $42}')
d43=$(echo $data | awk -F, '{print $43}')
d44=$(echo $data | awk -F, '{print $44}')
d45=$(echo $data | awk -F, '{print $45}')
d46=$(echo $data | awk -F, '{print $46}')
d47=$(echo $data | awk -F, '{print $47}')
d48=$(echo $data | awk -F, '{print $48}')
d49=$(echo $data | awk -F, '{print $49}')
d50=$(echo $data | awk -F, '{print $50}')
d51=$(echo $data | awk -F, '{print $51}')
d52=$(echo $data | awk -F, '{print $52}')
d53=$(echo $data | awk -F, '{print $53}')
d54=$(echo $data | awk -F, '{print $54}')
d55=$(echo $data | awk -F, '{print $55}')
d56=$(echo $data | awk -F, '{print $56}')
d57=$(echo $data | awk -F, '{print $57}')
d58=$(echo $data | awk -F, '{print $58}')
d59=$(echo $d2 | cut -d "." -f 2,3)
d60=$(echo $data | awk -F, '{print $19}' | awk 'BEGIN{FS=OFS=","} {gsub(/[[:punct:] ]/,"",$1)} 1' |  sed 's/[^0-9]*//g' )




mysql -u da_new -pxxxxxxxxxx -D da_new -e "insert into database123 (prime,domain_name,query_time,create_date,update_date,expiry_date,domain_registrar_id,domain_registrar_name,domain_registrar_whois,domain_registrar_url,registrant_name,registrant_company,registrant_address,registrant_city,registrant_state,registrant_zip,registrant_country,registrant_email,registrant_phone,registrant_fax,administrative_name,administrative_company,administrative_address,administrative_city,administrative_state,administrative_zip,administrative_country,administrative_email,administrative_phone,administrative_fax,technical_name,technical_company,technical_address,technical_city,technical_state,technical_zip,technical_country,technical_email,technical_phone,technical_fax,billing_name,billing_company,billing_address,billing_city,billing_state,billing_zip,billing_country,billing_email,billing_phone,billing_fax,name_server_1,name_server_2,name_server_3,name_server_4,domain_status_1,domain_status_2,domain_status_3,domain_status_4,tld_id,country_id,phone_id) VALUES ('$d1','$d2','$d3','$d4','$d5','$d6','$d7','$d8','$d9','$d10','$d11','$d12','$d13','$d14','$d15','$d16','$d17','$d18','$d19','$d20','$d21','$d22','$d23','$d24','$d25','$d26','$d27','$d28','$d29','$d30','$d31','$d32','$d33','$d34','$d35','$d36','$d37','$d38','$d39','$d40','$d41','$d42','$d43','$d44','$d45','$d46','$d47','$d48','$d49','$d50','$d51','$d52','$d53','$d54','$d55','$d56','$d57','$d58','$d59','$d17','$d60');" &





done < $line &




 
done < list.txt &

我只想在后台运行脚本。

【问题讨论】:

  • 除了一些奇怪的东西(你真的在你的db-new 目录中有一个字面命名为* 的压缩文件吗?),我看不出这样做的目的在后台运行脚本,因为您已经在后台运行了外部循环,并且在进入循环之前没有发生太多事情。除此之外,我会在脚本中打开set -x 并将stderr 重定向到某个文件。从此跟踪中,您可以看到是哪一行导致了错误消息,这应该会为您提供一些解决方法的提示。

标签: bash awk terminal


【解决方案1】:

建议使用单个awk 脚本来生成所有sql 插入语句。进入sql 脚本。

一旦你有一个sql 脚本。

运行单个mysql 命令来运行生成的sql 脚本。

建议提出一个新问题。从list.txt 和相应的sql 语句中提供几行输入。

【讨论】:

    【解决方案2】:

    单独背景一切似乎是严重的矫枉过正。如果您需要并行性,可以在后台运行 SQL 命令;但是如果你在后台运行 I/O 的简单解析并不会更有效;无论如何,一次又一次地解析相同的数据是完全没有必要的。

    这里尝试重构最明显的奇怪之处。

    cd /home/domainsanalytics/db-new
    
    # Presumably you meant *  without a backslash here?
    unzip *
    gunzip *
    
    # Don't parse ls -- https://mywiki.wooledge.org/ParsingLs
    # Don't put the list of files in a temporary file
    for file in *csv*; do
        # Indent your loops
        # Refactor to avoid awk | awk | tr
        awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", "", $i);
            gsub(/\"/,""); gsub(/[\042\047]/, ""); } 1' "$file" |
        # Let read split the line into tokens
        while IFS="," read -r _ d2  d3  d4  d5  d6  d7  d8  d9 \
                        d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 \
                        d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 \
                        d30 d31 d32 d33 d34 d35 d36 d37 d38 d39 \
                        d40 d41 d42 d43 d44 d45 d46 d47 d48 d49 \
                        d50 d51 d52 d53 d54 d55 d56 d57 d58
        do
            d1=$d2+$d3
            d59=$(echo "$d2" | cut -d "." -f 2,3)
            d60=$(echo "$d19" | awk 'BEGIN{FS=OFS=","} {gsub(/[[:punct:]]+/,"",$1); gsub(/[^0-9]+/, ""); } 1')
            mysql -u da_new -pxxxxxxxxxx -D da_new -e "insert into database123 (prime,domain_name,query_time,create_date,update_date,expiry_date,domain_registrar_id,domain_registrar_name,domain_registrar_whois,domain_registrar_url,registrant_name,registrant_company,registrant_address,registrant_city,registrant_state,registrant_zip,registrant_country,registrant_email,registrant_phone,registrant_fax,administrative_name,administrative_company,administrative_address,administrative_city,administrative_state,administrative_zip,administrative_country,administrative_email,administrative_phone,administrative_fax,technical_name,technical_company,technical_address,technical_city,technical_state,technical_zip,technical_country,technical_email,technical_phone,technical_fax,billing_name,billing_company,billing_address,billing_city,billing_state,billing_zip,billing_country,billing_email,billing_phone,billing_fax,name_server_1,name_server_2,name_server_3,name_server_4,domain_status_1,domain_status_2,domain_status_3,domain_status_4,tld_id,country_id,phone_id) VALUES ('$d1','$d2','$d3','$d4','$d5','$d6','$d7','$d8','$d9','$d10','$d11','$d12','$d13','$d14','$d15','$d16','$d17','$d18','$d19','$d20','$d21','$d22','$d23','$d24','$d25','$d26','$d27','$d28','$d29','$d30','$d31','$d32','$d33','$d34','$d35','$d36','$d37','$d38','$d39','$d40','$d41','$d42','$d43','$d44','$d45','$d46','$d47','$d48','$d49','$d50','$d51','$d52','$d53','$d54','$d55','$d56','$d57','$d58','$d59','$d17','$d60');" &
        done
    done
    

    认为我理解你试图用复杂的 Awk 解析做什么,但如果没有样本数据来测试,我很容易忽略一些东西。

    【讨论】:

      猜你喜欢
      • 2015-09-01
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 2021-12-11
      • 2014-11-29
      • 2011-12-10
      相关资源
      最近更新 更多