shell参数传递SQL脚本

#!/bin/bashforfilenameinfile_*dosqlplus-Sg471725/g471725<<EOFdefinev_input_file=$file... #!/bin/bash
for filename in file_*
do
sqlplus -S g471725/g471725 <<EOF
define v_input_file=$filename
@sql.sql
exit
EOF
done
以上是一个简单脚本,假设目录下有file_1,file_2,file_3,file_4这几个文件,我要把这4个文件做输入文件执行SQL脚本
但是最后没有结果出来,原因是传递的参数是file_*,没有将file_1,file_2等传递进去,求教如何解决
展开
 我来答
小米飞猫
推荐于2016-06-29 · 专注于IT监控领域技术
小米飞猫
采纳数:1653 获赞数:4811

向TA提问 私信TA
展开全部
你可以这么写,把目录下file_1,file_2,file_3 文件名保存在一个文本文件里,
这个文件叫file.txt,格式一行一个文件名。比如脚本叫test.sh
使用:./test.sh file.txt
这样就循环读取文本中每行的文件名并代入到变量filename
或者你也可以通过files=($(ls -l | grep ^- | awk '{print $8}'))
截取一个files数组然后,for filename in ${files[*]} 往for循环里套。
#!/bin/bash
while read filename
do
sqlplus -S g471725/g471725 <<EOF
define v_input_file=$filename
@sql.sql
exit
EOF
done < $1
追问
谢谢你的回答,
第一个了解了,数组那个不太了解,可以解释下吗 我是shell菜鸟,刚学的
追答
$(xxxx)里可以用来执行命令
($(xxxx))外边的()是吧里边$()执行的结果存成一个数组赋值给前面的变量名
ls -l | grep ^- | awk '{print $8}'
这就是一个命令的组合,|是管道,这个不用说吧?
意思就是:把ls -l的结果传递给grep ^- 是过滤掉开头不是以- 开头的文件
以-开头的文件,都是文件,你可以理解为只显示文件,其他的比如目录不显示
通过awk 截取第8个域 第8个域是文件名,把截取的文件名存为到files这个变量里
files是一个数组
#!/bin/bash
dir="/tmp" #定义file_1相关文件的目录
files=($(ls -l $dir | grep ^- | awk '{print $8}')) #截取数组
for filename in ${files[*]} #把数组元素依次代入到变量filename
do
sqlplus -S g471725/g471725 <<EOF
define v_input_file=$filename
@sql.sql
exit
EOF
done
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式