Dar*_*Ivy 3 unix linux bash shell ifs
这个 bash 脚本将一个数组写入一个文件,然后将该文件读回另一个数组。(这对于脚本之间基于数组的通信很有用。)但是,该IFS行(第 12 行)捕获了一个奇怪的、未报告的错误。为什么?
#!/bin/bash
# eso-error-ic
trap 'echo Error trapped, with code $?, on line ${LINENO}' ERR
# write data to a file
arr=(0 abc) && printf "%s\n" "${arr[@]}" > eso.out
# read data from the file into an array
# throws an error!!
IFS=$'\n' read -d '' -a new_arr < eso.out
# but it worked...
echo ${new_arr[0]}
echo ${new_arr[1]}
Run Code Online (Sandbox Code Playgroud)
脚本输出:
Error trapped, with code 1, on line 12
0
abc
Run Code Online (Sandbox Code Playgroud)
缺少的是产生错误时显示的任何类型的消息。你得到的只是来自陷阱的消息,但没有关于错误是什么的消息。
换句话说,IFS/read 行产生一个错误,该错误被捕获,但没有显示错误消息,并且该行正确地将文件读入数组变量。它可以工作,没有报告错误,但会捕获一个“错误”。
如果您注释掉陷阱线或切换到命令/ EVAL /猫的方法来读取文件到一个数组(如建议在这里),没有错误被困。下面是这个脚本的 command/eval/cat 行的样子(替换第 12 行):
IFS=$'\n' GLOBIGNORE='*' command eval 'new_arr=($(cat eso.out))'
Run Code Online (Sandbox Code Playgroud)
错误来自未收到read预期的分隔符。我也一样
read -d x variable <<<"hello"
Run Code Online (Sandbox Code Playgroud)
如果我将输入更改"hellox"为错误消失。
正如@Aserre 所提到的,详细的分析在我们的Unix 和 Linux 姊妹网站上,正如@CharlesDuffy 所指出的,一个常见的解决方法是
read variable || [[ $variable ]]
Run Code Online (Sandbox Code Playgroud)
即使没有-d处理可能缺少最终终止换行符的文件,也可以使用它。