【问题标题】:How to iterate over bash sqlcmd output如何遍历 bash sqlcmd 输出
【发布时间】:2019-11-05 19:01:27
【问题描述】:

我在 linux bash 中有一个 SQLCMD,我得到了 SELECT 的结果,我如何遍历每一行,并能够挑选出特定的列,以便我可以使用它们来运行 bash 命令

我目前执行 SELECT 并输出到 csv 文件,它工作正常,但我宁愿找到一种不导出的方法,因为权限正在发挥作用,我需要使用一个脚本完全运行所有内容

#!/bin/bash

sqlcmd -S DB_string -d DB -U USERNAME -P PASSWORD -Q \
"SET NOCOUNT ON SELECT * FROM dbo.microiopenvpn WHERE mode='create' ORDER BY id" -o "sqloutputCheckCreate.csv" -W -w 1024 -s"," -h-1
line_no=0
file=sqloutputCheckCreate.csv
line_no=$(awk '{x++} END {print x}' $file)
echo $line_no

#rowCount= sqloutputCheckCreate.csv | wc -l

if [ $line_no > 0 ]; then
    echo "SQL Has Entries"
    while IFS="," read -r d1 d2 d3 d4 d5 d6; do

      if [ -e "/etc/openvpn/clients/$d6.ovpn" ]; then
            echo "$d6 File exists"
            sqlcmd -S DB_string -d DB -U USERNAME -P PASSWORD -Q \ -Q "SET NOCOUNT ON UPDATE dbo.microiopenvpn SET mode='valid' WHERE id='$d1'" < /dev$                echo "Database Updated - Successfully"
      else
            echo "$d6 does not exist - Action Creation Script of $d6"
            ./executecreate.sh
      fi

    done < sqloutputCheckCreate.csv    
 else
    echo "Nothing there"
  fi

cp /dev/null sqloutputCheckCreate.csv

以上方法在导出到外部 csav 文件时有效,但我需要将 sql 导出放入变量中并循环 - 所以没有任何外部想法?

【问题讨论】:

    标签: linux bash sqlcmd


    【解决方案1】:

    类似:

    sqlcmd ... | while IFS="," read -r d1 d2 d3 d4 d5 d6
    do
        :# stuff
    done
    

    或者,或者:

    while IFS="," read -r d1 d2 d3 d4 d5 d6
    do
        :# stuff
    done < <(sqlcmd ...)
    

    【讨论】:

    • 完美运行 - 谢谢。好的,所以当我运行它时,它只执行 1 行,即使查询应该至少占用 2 行,它也不会转到下一行,当我再次运行它时,它会在我的 sql 连接上选择下一行 - s "~",所以我知道是什么分隔列 - 任何想法
    【解决方案2】:

    将单列读入 Bash 循环

    SQLCMD="sqlcmd -h -1 -S $SERVERNAME -U $USERNAME -P $PASSWORD -d $DBNAME -Q"
    for ctry in $($SQLCMD " SET NOCOUNT ON; SELECT ctry_cd FROM country ")
    do
        echo "Processing for Ctry: $ctry "
    done
    

    将多列读入 Bash 循环

    $SQLCMD " SET NOCOUNT ON; SELECT ctry_cd, ctry_nm FROM country " | while read -r ctry_cd ctry_nm
    do
         echo "Processing for Ctry: $ctry_cd Name: $ctry_nm "
    done
    

    【讨论】:

      猜你喜欢
      • 2013-12-26
      • 2021-01-02
      • 2013-02-18
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      相关资源
      最近更新 更多