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

标签 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})什么是[], @, / combine together for in this command 为什么这样的语法,特别是 [@] ,我想知道这是什么?

有人能帮我弄清楚吗?谢谢。

最佳答案

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

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

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

echo ${testarray[@]}

结果:盒子猫狗

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

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

看看这里发生了什么?找到狗并将其替换为空。检查一下:

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

那只是用 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..$item$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

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

我上面的例子可能不准确。目的是为您提供一个示例,说明如何获取您正在寻找的信息。

关于oracle - sqlplus shell脚本中方括号中的@(at符号)是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41113307/

相关文章:

oracle - Oracle 中计划作业失败时发送通知电子邮件

linux - 如何在 *nix 中登录时运行脚本?

bash - 使用 bash printf 包装列的正确方法

linux - 如何 SSH,验证更新是否可用。如果是,请下载更新

oracle - 如何从表中最大化字母字符?

sql - 当我显示数据并仅获取 hh :mm:ss am format? 时,是否可以从 Oracle SQL DATE 隐藏 dd-mon-yyyy 组件

database - 如何解决 Oracle SQL 语句的性能问题

debugging - 如何不忘记删除代码中的调试行

linux - 第一个 bash 脚本不工作

mysql - CAT 作为 Bash 脚本的参数