sqlplus shell 脚本中方括号中的@(at 符号)是什么意思?
what @ (at symbol) in square braces on sqlplus shell script mean?
我正在编写一个 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" "
末尾带有 space 的双引号是什么,为什么使用这样的语法?
(2) SuccessTabs=({$SuccessTabs[@]/$TABLE})
什么是 []
, @
, /
combine together for this command and why syntax like this, especially for [@]
,我想知道这是什么?
有人可以帮我弄清楚吗?谢谢你。
TotFiles=$TotFiles$FILE" "
追加到 TotFiles
、FILE
的内容和一个 space(这就是为什么你有 " "
)到现有 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 !
先说[@]
。在 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
什么都不是。 $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
的 list/array,$FILE 在 TABLES 的每次迭代期间将是 box.csv、cat.csv 和 dog.csv。 TotFiles=$TotFiles$FILE" "
将变为 box.csv cat.csv dog.csv
.
在两个地方查看更多示例:
- http://www.tldp.org/LDP/abs/html/arrays.html
- http://www.gnu.org/software/bash/manual/html_node/Arrays.html
我上面的例子可能不准确。目的是为您提供一个示例,说明如何获取您正在寻找的信息。
我正在编写一个 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" "
末尾带有 space 的双引号是什么,为什么使用这样的语法?
(2) SuccessTabs=({$SuccessTabs[@]/$TABLE})
什么是 []
, @
, /
combine together for this command and why syntax like this, especially for [@]
,我想知道这是什么?
有人可以帮我弄清楚吗?谢谢你。
TotFiles=$TotFiles$FILE" "
追加到 TotFiles
、FILE
的内容和一个 space(这就是为什么你有 " "
)到现有 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 !
先说[@]
。在 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
什么都不是。 $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
的 list/array,$FILE 在 TABLES 的每次迭代期间将是 box.csv、cat.csv 和 dog.csv。 TotFiles=$TotFiles$FILE" "
将变为 box.csv cat.csv dog.csv
.
在两个地方查看更多示例:
- http://www.tldp.org/LDP/abs/html/arrays.html
- http://www.gnu.org/software/bash/manual/html_node/Arrays.html
我上面的例子可能不准确。目的是为您提供一个示例,说明如何获取您正在寻找的信息。