使用bash拆分字符串在debian服务器中不起作用

使用bash拆分字符串在debian服务器中不起作用,bash,debian,Bash,Debian,我想使用“of”拆分ins_数据字符串,并将2个数字分成2个变量 我的代码是这样的 #!/usr/bin/env bash ins_data="3,998 of 5,903" IFS=' of ' read -ra ins_data_arr <<< ${ins_data} total_ins=${ins_data_arr[1]//,} missed_ins=${ins_data_arr[0]//,} echo $total_ins echo $missed_ins #/u

我想使用“of”拆分ins_数据字符串,并将2个数字分成2个变量

我的代码是这样的

#!/usr/bin/env bash

ins_data="3,998 of 5,903"
IFS=' of ' read -ra ins_data_arr <<< ${ins_data}
total_ins=${ins_data_arr[1]//,}
missed_ins=${ins_data_arr[0]//,}

echo $total_ins
echo $missed_ins
#/usr/bin/env bash
ins_data=“3998/5903”
IFS=“of”读取-ra ins\u data\u arr
现在我们在“o”和“f”之间有一个空字段,在“f”和“f”之间有一个空字段

我假设这是bash版本4的新行为——OSX上的默认bash是版本3.0。行为改变的答案就在这里:


找到它:

zz。分词代码现在处理的是不是空格的IFS字符, 制表符,或换行符和任何相邻的IFS空格作为单个分隔符,如 SUSv3/XPG6需要

本文件记录了“本版本、bash-3.1-alpha1、, 还有以前的版本,bash-3.0-release。”——所以您的bash“it works”版本一定很旧了


话虽如此,我建议的修复方法是:不要使用自定义IFS,只需考虑以下事实,即您将阅读3个单词:

$ read -r missed of total <<<"$ins_data"
$ declare -p missed of total
declare -- missed="3,998"
declare -- of="of"
declare -- total="5,903"
$ echo "${missed//,/}"
3998
$ echo "${total//,/}"
5903

$read-r missed of total
IFS='of'
IFS='fo'
完全相同,顺便说一句——它定义了一个无序的字符集合(几乎无序;哪一个是第一个有一些重要的副作用),而不是一个精确的字符串。也有一些与引用有关的问题或缺少它的问题——考虑在代码中运行和跟踪其警告中的链接……无论如何,这个代码是如何运行的?如果将其作为
sh yourscript
调用,则会出现问题--它是使用
sh
运行的,而不是
bash
,因此仅使用bash的语法(您正在使用的大部分语法)将不可用。
$ IFS=' of ' read -ra ins_data_arr <<< "3,998 off 5,903"
$ declare -p ins_data_arr
declare -a ins_data_arr='([0]="3,998" [1]="" [2]="" [3]="5,903")'
$ read -r missed of total <<<"$ins_data"
$ declare -p missed of total
declare -- missed="3,998"
declare -- of="of"
declare -- total="5,903"
$ echo "${missed//,/}"
3998
$ echo "${total//,/}"
5903