在sqlplus shell脚本的方括号中的@(at符号)是什么意思?

时间:2016-12-13 03:32:32

标签: oracle bash shell sqlplus

我正在使用shell脚本来处理sqlplus(oracle),代码如下:

#!/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})什么是[]@/组合在一起用于此命令以及为什么这样的语法,尤其是[@] ,我想知道这是什么?

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

2 个答案:

答案 0 :(得分:4)

首先谈谈[@]。在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变量。

在第3个循环中,$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

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

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

答案 1 :(得分:0)

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 !