我有以下 Bash 脚本,它捕获要为数据库插入语句准备的 TUI 数据(zenity):
#!/bin/bash
INPUT=NULL,2,Van Tassel,NULL,5,6,,8
INPUT="$(echo $INPUT | ( IFS=, read a b c d e f g h ; echo "$a,${b}xxx,$c,$d,${e}xxx,${f}xxx,${g}}
xxx,${h}xxx" ))"
IFS=,; set -f; set -- $INPUT; out=
for i in "$@"; do
case "$i" in
"") echo empty input not allowed; exit 0;;
NULL) out="$out,$i";;
*xxx) out="$out,${i/%xxx/}";;
*) out="$out,\$\$$i\$\$";;
esac;
done
echo "${out:1}"
在运行此脚本时,我收到以下错误消息:
./err.txt: line 4: Tassel,NULL,5,6,,8: command not found
empty input not allowed
这个脚本有两个问题,我不知道如何解决它们。一方面,Van Tassel 条目仅在输入为“Van Tassel”或 VanTassel 时才有效,这不是从 TUI 界面接收多个字符串的方式。
第二个问题是 case "") 不起作用。如果我再次运行相同的脚本但编写 VanTassel 而不是 Van Tassel,我会得到以下输出而不是消息“不允许空输入”。
NULL,2,$$VanTassel$$,NULL,5,6,,8
这不应该是这种情况,因为第 7 个字段是空的。
任何人都可以帮助解决这个问题?
INPUT=NULL,2,Van Tassel,NULL,5,6,,8
就像foo=bar baz
:在环境中baz
运行foo
变量bar
。在 shell 脚本中,您需要引用或转义空格来抑制此行为。在静态行的情况下,引用整个值通常是最好的解决方案:
在发布的代码中,该行是静态的,但实际上“从 TU 接口接收到多个字符串”,对吗?在这种情况下,解决方案可能取决于这是如何发生的。
当你声称输出是
NULL,2,$$VanTassel$$,NULL,5,6,,8
时,它真的是因为在您的代码中
${g}}
,紧随其后的是换行符。下次发布您正在测试的代码或测试您正在发布的代码。:)据称此案
"")
不起作用,因为您首先要注入xxx
第 7 个字段!以这种方式修改的字段永远不会匹配空字符串;它会匹配*xxx
。xxx
然后在构建时删除out
,该字段将返回其原始空值。echo $INPUT
非常脆弱,可能会给您带来意想不到的结果。未引用的$INPUT
行为类似于此答案:发生拆分和文件名生成(通配符)。请注意,当我们set -- $INPUT
稍后使用时,我们确实想要拆分并且我们抑制通配(set -f
更早)。但是你echo $INPUT
的两者都很容易。即使您使用echo "$INPUT"
,这仍然适用:为什么printf
优于echo
?在 Bash 你可以做read -r
除非您知道您不想要,否则请使用-r
(请参阅 参考资料help read
)。也许
INPUT
应该是input
。阅读:shell 脚本中变量的命名约定。