【问题标题】:Shell variable value substitutionShell 变量值替换
【发布时间】:2019-03-08 15:35:33
【问题描述】:

这是我的问题的描述,我有一个从文件中获取值的 while 循环

while read table
do
    schema="$(echo $table | cut -d'.' -f1)";
    tabname="$(echo $table | cut -d'.' -f2)";
    echo "$schema";
    echo "$tabname";
    echo $folder/$table_space"_auto_ddl"/$tabname"_AUTO_"$schema".sql.tmp"
    echo $folder/$table_space"_auto_ddl"/${tabname}"_AUTO_"${schema}.sql
    print $schema.$tabname;
done < $folder/tables_ddl_list.log

这是一个值的示例

MCLM.OPPP

将值解析为 2 个变量 所以在回应 $schema 之后,我希望 MCLM 呼应 $tabname 我希望 OPPP

但我会得到空字符串

我正在使用 kornshell,我认为它是旧版本

【问题讨论】:

    标签: shell ksh


    【解决方案1】:

    您可以像这样使用read 更有效地编写循环,而无需为要提取的每个字段使用cut 之类的外部命令:

    while IFS=. read -r schema table _; do
        # your logic
    done < "$folder/tables_ddl_list.log"
    

    read_ 的第三个参数是出于安全考虑 - 如果输入在一行上有多个点,则所有额外的值都将被 _ 捕获。或者,您可以根据是否设置 _ 添加错误检查。

    相关:

    【讨论】:

    • 这假设每行正好有一个点。也许read -r schema table _ 在第二个点之后丢弃任何东西。
    • 好点,@tripleee。更新了答案。
    【解决方案2】:

    在读取变量值时尝试删除双引号,并在 $table 变量中使用双引号,例如:

    schema=$(echo "$table" | cut -d'.' -f1)
    tabname=$(echo "$table" | cut -d'.' -f2)
    

    【讨论】:

    • 一个可以有 both 外引号和内引号——它们之间没有冲突,因为命令替换有它自己的引用上下文。也就是说,确实有必要在"$table" 周围加上引号。
    • @CharlesDuffy 为什么在这里引用导致问题? . 对分词没有特殊意义吧? var=a.b; echo $var | cut -f1 -d. 会产生 a,对吧?
    • @codeforester,一般情况下是必需的;并不是要谈论任何具体数据。也就是说,如果IFS=.,那么我们将在echo $var 中丢失它。
    猜你喜欢
    • 2014-01-04
    • 2015-03-10
    • 2016-10-06
    • 2023-01-11
    • 1970-01-01
    • 2014-01-09
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多