#! /bin/bash
if [ $1 ]; then
redirect="<"$1
else
redirect="<&0"
fi
mysql --host=a.b --port=3306 --user=me --password='!' -D DCVBase2 $redirect
想要从文件或标准输入重定向。可以在$ redirect周围使用一些quatation吗?
答案 0 :(得分:2)
这样的事情会起作用:
#!/bin/bash
if [ "$1" ]; then
redirect="$1"
else
redirect="/dev/tty"
fi
while read LINE
do
echo ${LINE}
done < ${redirect}
答案 1 :(得分:1)
我担心我没有足够的声誉将此作为评论,所以这将是必须的。
答案 2 :(得分:1)
在标准bash中不可能,因为重定向在变量扩展之前被处理(虽然我似乎找不到参考,所以你必须相信我的实证结果)。
您可以使用eval命令解决这个问题:
$ redirect=">foo"
$ ls $redirect
ls: cannot access >foo: No such file or directory
$ eval ls $redirect
请注意这会打开一堆关于替换,引用等等的蠕虫,所以你必须小心逃避eval之前你不想解释的一切(你的命令中的!可能会成为一个问题,因为例子)。
$ foo=\$bar
$ bar=baz
$ echo $foo
$bar
$ eval echo $foo
baz
答案 3 :(得分:1)
您不能将“&lt; ...”放在变量中,但可以在变量中将参数放入
此外,从/ dev / fd / 0重定向stdin是一个无操作,因为/ dev / fd / 0是bash的stdin,这是mysql默认继承的。
所以你可以通过回退到/ dev / fd / 0中的stdin来完成这项工作,它看起来类似于James_R_Ferguson的答案,除了它使用/ dev / fd / 0,因为使用/ dev / tty假设bash的stdin是一个真正的终端。
#! /bin/bash
if [ -n "$1" ]; then # note, I changed this to test for non-empty
redirect="$1"
else
redirect="/dev/fd/0"
fi3
mysql --host=a.b --port=3306 --user=me --password='!' -D DCVBase2 < "$redirect"