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

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

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

zed*_*xus 5

让我们[@]先谈谈。在 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什么都不是。$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,则 $FILE 在 TABLES 的每次迭代期间将是 box.csv、cat.csv 和 dog.csv。TotFiles=$TotFiles$FILE" "将成为box.csv cat.csv dog.csv.

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

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