【问题标题】:what @ (at symbol) in square braces on sqlplus shell script mean?sqlplus shell脚本方括号中的@(at符号)是什么意思?
【发布时间】:2017-04-28 01:17:54
【问题描述】:

我正在编写一个与 sqlplus (oracle) 一起使用的 shell 脚本,代码如下:

#!/usr/bin/bash

################ Checking tables ###################
TABLES=$(sqlplus -s  ${DBUSER}/${DBPASS}@${DBHOST} <<EOF
...
EOF
)

SuccessTabs=$TABLES

########## Export data from tables to file #########
for TABLE in $TABLES
do
echo "--- Processing $TABLE ---" >> $Log
FILE=$TABLE.csv
TotFiles=$TotFiles$FILE" " -------------------------> (1) Not understand this line ?
sqlplus -s  ${DBUSER}/${DBPASS}@${DBHOST} <<EOF
...
SPOOL $FILE
Select ... FROM $TABLE;
SPOOL OFF
EXIT
EOF

return=$?
if [ $return != 0 ]
then
SuccessTabs=({$SuccessTabs[@]/$TABLE}) -------------> (2) Not understand this line ?
else
echo "--- $TABLE.csv process success ---" >> $Log
fi
done
echo "--- Process all tables success --- " >> $Log
echo "$SuccessTabs " >> $Log
FinalFile=FINAL_"_"${rundate}_${logtime}".csv"
echo "--- Merge all files into $FinalFile ---" >> $Log
cat $TotFiles > $FinalFile

问题是我有两个命令行,即使我从字面上知道它用于打印结果,但仍然不明白它的语法和机制。

(1)TotFiles=$TotFiles$FILE" " 什么是双引号,末尾有空格,为什么这样的语法?

(2)SuccessTabs=({$SuccessTabs[@]/$TABLE})[],@,/组合在一起用于这个命令,为什么这样的语法,尤其是[@],我想知道这是什么?

有人可以帮我弄清楚吗?谢谢你。

【问题讨论】:

    标签: oracle bash shell sqlplus


    【解决方案1】:
    TotFiles=$TotFiles$FILE" "
    

    附加到TotFilesFILE 的内容和一个空格(这就是为什么你有" ")到现有的TotFiles。我建议把它写成

    TotFiles="${TotFiles}${file} "  # It's not suggested to use UpperCase letters for user variables
    

    关于

    SuccessTabs=({$SuccessTabs[@]/$TABLE})
    

    除非您将SuccessTabs 声明为数组,否则对我来说没有多大意义。请注意,如果您有

    declare -a var=( array...stuff )
    var=( ${var[@]/STUFF_TO_OMIT} ) #omits the `STUFF_TO_OMIT` from the array, ie it gives you everything except `STUFF_TO_OMIT`
    

    如果你打算这样做,那么你需要改变

    SuccessTabs=({$SuccessTabs[@]/$TABLE})
    

    SuccessTabs=( ${SuccessTabs[@]/$TABLE} ) # See how curly brackets are placed, again not a good idea using uppercase variables !
    

    【讨论】:

    • 也感谢您的发帖和评论,给我一些宝贵的提示。
    【解决方案2】:

    我们先说[@]。在 bash 中,您可以像这样声明一个数组:

    declare -a testarray=('box' 'cat' 'dog')
    

    您可以通过执行以下操作来回显 testarray 的内容:

    echo ${testarray[@]}
    

    结果:box cat dog

    现在,让我们看看一个有趣的行为:

    echo ${testarray[@]/dog}
    box cat
    

    看看这里发生了什么?找到狗,什么都没有。看看这个:

    echo ${testarray[@]/dog/pig}
    box cat pig
    

    那只是把狗换成了猪。

    因此,第二个问题的答案是,如果 SuccessTabs 数组包含与 $TABLE 中相同的文本,则该文本将被替换为空。结果被分配回变量SuccessTabs


    那么TotFiles=$TotFiles$FILE" " 在做什么?以同样的测试数组为例,让我们循环遍历它的所有值。

    $ declare -a testarray=('box' 'cat' 'dog')
    $ for item in ${testarray[@]}; do
    >     testvar=$testvar$item".."
    >     echo $testvar
    > done
    box..
    box..cat..
    box..cat..dog..
    

    所以,在第一个循环中,$testvar 什么都不是。 $itembox$testvar$item".."box..。此值分配给testvar 变量。

    在第二个循环中,$testvarbox..$itemcat$testvar$item".."box..cat..。此值分配给testvar 变量。

    在第三个循环中,$testvarbox..cat..$itemdog$testvar$item".."box..cat..dog..。此值分配给testvar 变量。

    同样,如果 TABLES 是一个包含 box cat dog 的列表/数组,则在 TABLES 的每次迭代期间,$FILE 将是 box.csv、cat.csv 和 dog.csv。 TotFiles=$TotFiles$FILE" " 将变为 box.csv cat.csv dog.csv

    在两个地方查看更多示例:

    我上面的例子可能不准确。目的是为您提供如何获取所需信息的示例。

    【讨论】:

    • 不错。关于你回答的第一部分,请注意,操作在{$SuccessTabs[@]/$TABLE} 中放错了左大括号。
    • @zedfoxus,绝妙的答案,很棒的示例和有用的链接,阅读您的答案后,我完全理解代码行为,尤其是带有详细分析的优雅示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多