Я столкнулся со странной проблемой после временного изменения IFS
с целью построения массива:
$ echo "1 2 3" |while read myVar1 myVar2; do echo "myVar1: ${myVar1}"; echo "myVar2: ${myVar2}"; done
myVar1: 1
myVar2: 2 3
$ IFS=':' myPaths=( ${PATH} ) # this works: I have /home/morgwai/bin on ${myPaths[0]} , /usr/local/sbin on ${myPaths[1]} and so on
$ echo "1 2 3" |while read myVar1 myVar2; do echo "myVar1: ${myVar1}"; echo "myVar2: ${myVar2}"; done
myVar1: 1 2 3
myVar2:
$ echo $IFS
$ echo "1:2:3" |while read myVar1 myVar2; do echo "myVar1: ${myVar1}"; echo "myVar2: ${myVar2}"; done ;
myVar1: 1
myVar2: 2:3
Обычно, когда я временно меняю IFS
для любой другой команды, кроме построения массива (например, IFS=',' echo whatever
), его значение изменяется только во время выполнения этого, однако здесь кажется, что IFS
навсегда изменился на двоеточие (хотя echo $IFS
этого не показывает , что еще более странно ...).
Это ошибка или какое-то ожидаемое поведение, которого я не понимаю?
Я использую bash версии 4.4.18, если это важно ...
Примечание: я знаю, что могу построить тот же массив, используя IFS=':' read -a myPaths <<< ${PATH}
, а затем IFS
обычно возвращается к значению по умолчанию, но дело не в этом: я пытаюсь понять, что на самом деле происходит в приведенном выше примере. < / em>
Спасибо!
echo $IFS
показывает пустую строку вместо двоеточия? - person morgwai   schedule 12.07.2020printf '%q\n' "$IFS"
отображать текущее значение в визуально однозначной форме. - person Charles Duffy   schedule 12.07.2020IFS=':' myPaths=( ${PATH} )
это всего два назначения, и ни одно из них не является временным; в строке должна быть настоящая обычная команда, чтобы предшествующие им назначения обрабатывались как переменные среды, привязанные к этой команде. - person Charles Duffy   schedule 12.07.2020array=( $content )
не является хорошей практикой - если вы не отключите глобализацию, у нее есть потенциал для большего, чем просто разбиение на IFS. См. BashPitfalls # 50. - person Charles Duffy   schedule 12.07.2020IFS
в кому в начале, как вы это делаете в своем редактировании, иecho $IFS
печатает пустую строку, что является важным фактором, и я надеюсь получить объяснение также - person morgwai   schedule 12.07.2020echo $IFS
, это довольно забавно;) ubuntuforums.org/showthread .php? t = 1454313 - person morgwai   schedule 12.07.2020${IFS@E}
или${IFS@Q}
вместо этогоprintf
бита. - person Shawn   schedule 12.07.2020IFS
). - person Charles Duffy   schedule 12.07.2020