Shell脚本中如何拼接变量生成test_keyspace.a格式的完整表名?
Shell脚本变量拼接问题的解决方法
你的脚本核心问题在于tableName的赋值语法错误,导致tableName变量并未正确获取到awk输出的值。当前写法tableName= echo "${_dataFile}" | awk ...会把tableName=当作临时环境变量传递给echo命令,而非将命令输出赋值给当前Shell的tableName变量,后续拼接时tableName实际为空,最终结果不符合预期。
解决方案
- 使用命令替换语法(
$())将awk命令的输出赋值给tableName,这是Shell中获取命令输出到变量的标准写法。 - 变量拼接时用
${变量名}明确指定变量边界,避免Shell解析歧义(这也是良好的编程习惯)。
修改后的完整脚本
_keySpace=$(sed 's/CREATE KEYSPACE IF NOT EXISTS//I' cassandra/tables/keyspace_dev.cql | sed 's/CREATE KEYSPACE//I' | awk '{print $1}') # 直接用通配符遍历文件,比ls更安全(支持带空格的文件名) for _dataFile in cassandra/tables/data/*.csv do echo "${_dataFile}" # 正确赋值tableName tableName=$(echo "${_dataFile}" | awk -F'[/.]' '{print $4}') echo "${tableName}" fullName="${_keySpace}.${tableName}" # 输出正确拼接的完整表名 echo "${fullName}" done
额外优化建议
- 可以合并_keySpace提取的sed操作,简化命令:
_keySpace=$(sed -E 's/CREATE KEYSPACE( IF NOT EXISTS)?//I' cassandra/tables/keyspace_dev.cql | awk '{print $1}')
内容的提问来源于stack exchange,提问作者user468587
相关产品推荐
相关产品推荐

