Lam*_*ard 2 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
Run Code Online (Sandbox Code Playgroud)
问题是我有两个命令行,即使我从字面上知道它用于打印结果,但仍然不明白它的语法和机制是什么。
(1)TotFiles=$TotFiles$FILE" "什么是末尾带空格的双引号,为什么是这样的语法?
(2)SuccessTabs=({$SuccessTabs[@]/$TABLE})什么是[], @,/组合在一起用于此命令以及为什么这样的语法,特别是对于[@],我想知道这是什么?
有人可以帮我弄清楚吗?谢谢你。
让我们[@]先谈谈。在 bash 中,您可以像这样声明一个数组:
declare -a testarray=('box' 'cat' 'dog')
Run Code Online (Sandbox Code Playgroud)
您可以通过执行以下操作来回显 testarray 的内容:
echo ${testarray[@]}
Run Code Online (Sandbox Code Playgroud)
结果: box cat dog
现在,让我们看看一个有趣的行为:
echo ${testarray[@]/dog}
box cat
Run Code Online (Sandbox Code Playgroud)
看看这里发生了什么?找到狗并用空替换它。看一下这个:
echo ${testarray[@]/dog/pig}
box cat pig
Run Code Online (Sandbox Code Playgroud)
那只是用猪代替了狗。
因此,您的第二个问题的答案是,如果SuccessTabsarray 包含与 in 相同的文本$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..
Run Code Online (Sandbox Code Playgroud)
所以,在第一个循环中,$testvar什么都不是。$item是box。$testvar$item".."是box..。该值被分配给testvar变量。
在第二个循环中,$testvar是box..。$item是cat。$testvar$item".."是box..cat..。该值被分配给testvar变量。
在第三个循环中,$testvar是box..cat..。$item是dog。$testvar$item".."是box..cat..dog..。该值被分配给testvar变量。
类似地,如果 TABLES 是包含 的列表/数组box cat dog,则 $FILE 在 TABLES 的每次迭代期间将是 box.csv、cat.csv 和 dog.csv。TotFiles=$TotFiles$FILE" "将成为box.csv cat.csv dog.csv.
在两个地方查看更多示例:
我上面的例子可能有不准确之处。目标是为您提供一个示例,说明如何获取您正在寻找的信息。
| 归档时间: |
|
| 查看次数: |
1119 次 |
| 最近记录: |