JDS*_*JDS 4 arrays string bash scripting
我在使用IFS将我的字符串转换为数组时遇到问题.这是我的字符串:
"Jun01 Jun02 Jun03 Jun04 Jun05 ..." #in that format, separated by spaces
Run Code Online (Sandbox Code Playgroud)
这是我尝试过的代码:
IFS=" " #set it to space character
DATES_ARRAY=($DATES_STRING) #from above
echo ${DATES_ARRAY[0]} #output is empty
Run Code Online (Sandbox Code Playgroud)
但是,当我删除IFS线时,它的工作原理.但我使用几行打印出其默认的ASCII值,我得到'32',这意味着'空格'字符.作为一名OCD程序员,我想把它自己设置为安全......我不知道它是如何预先设定的!
那么为什么尝试手动将IFS设置为Space不起作用?
它确实有效,但无论如何都是不必要的,因为默认情况下保证空间在IFS中.不要手动设置.这样做可能会导致问题.
基本上,永远不要在Bash中使用分词.如果使用得非常小心,有时需要咬住子弹并使用它限制在POSIX sh.如果您要设置IFS,请将其设置在少数具有某些效果的命令之一的环境中,或者最多设置在本地功能的环境中.
你永远不需要使用它,所以我不解释一切:
$ printf -v str '%s ' Jun{01..10}
$ set -f
$ IFS=' ' declare -a 'arr=($str)'
$ declare -p arr
declare -a arr='([0]="Jun01" [1]="Jun02" [2]="Jun03" [3]="Jun04" [4]="Jun05" [5]="Jun06" [6]="Jun07" [7]="Jun08" [8]="Jun09" [9]="Jun10")'
Run Code Online (Sandbox Code Playgroud)
IFS在这里冗余设置空间以显示它的工作原理.
从字符串到数组的最正确方法可能就是使用read.这里有很多例子.
cannonical方法是:
read -ra arr <<<"$str"
Run Code Online (Sandbox Code Playgroud)
其中IFS可选择在环境中设置,read如果它不是空格,则用作分隔符.
我建议不要单独使用$IFS它来将字拆分到数组中,因为设置和恢复 $IFS 很痛苦。使用这样的东西:
DATES_STRING='Jun01 Jun02 Jun03 Jun04 Jun05'
IFS=' ' read -a DATES_ARRAY <<< "$DATES_STRING"
Run Code Online (Sandbox Code Playgroud)
我还建议明确设置$IFS环境read,以便您绝对确定它是什么。
| 归档时间: |
|
| 查看次数: |
29966 次 |
| 最近记录: |