Таким образом, проблема, которую вы видите, заключается в том, что вы запускаете for i in $(ls...)
, ожидая увидеть по одному файлу за раз, а вместо этого просто получаете одну запись со всем списком файлов в одном множестве -строковая строка.
Это вызвано IFS=' '
назначениями в ваших функциях. Они установили пробел в качестве единственного разделителя, что означает, что новая строка больше не будет считаться одной (, и для этого ls
необходимо было разбить на несколько строк.)
Поскольку вы устанавливаете IFS внутри fCKA1
и fCKA2
, вы в конечном итоге видите проблему во втором цикле, так как он выполняется после этих функций.
Это можно обойти, например, сохранив исходную IFS перед ее установкой и восстановив ее в конце функции.
Например:
fCKA1() {
hadoop fs -put $i $HDFS/cka-np1p/$Years/$Months
sleep 1
save_IFS=$IFS
IFS=' '
while read names rows sizes; do
...
rm -rf $i $i.ctrl
IFS=$save_IFS
}
Возможно, лучше, вы можете установить его только для команды "чтение" вот так:
IFS=' ' read names rows sizes
В контексте вашей функции вы получаете:
fCKA1() {
hadoop fs -put $i $HDFS/cka-np1p/$Years/$Months
sleep 1
while IFS=' ' read names rows sizes; do
...
rm -rf $i $i.ctrl
}
Также возникает вопрос, нужно ли вообще устанавливать IFS... По умолчанию используется разбиение по пробелам, любым пробелам... Вам действительно нужно разбивать по пробелам и только по пробелам? Попробуйте полностью удалить настройки IFS=' ', возможно, это сработает и для вас!
set является оператором в csh.
Является ли эхо-версия скриптом? (но обычно для загрузки модуля в csh используется команда 'source'.)
Что касается моего упоминания версии эха :в классической UNIX большинство вещей, которые используются в сценарии, представляют собой отдельные программы в системе, а не встроенные в оболочку (будь то csh,zsh,sh (bourne ),ksh (Korn )или tcsh (TENEX C Shell ).)
«Тест» в bash (рожден снова оболочкой bourne )является встроенной, как и эхо, в то время как в некоторых других версиях UNIX эхо и тест являются отдельными двоичными файлами.
Этот сценарий был значительно испорчен некоторым редактированием вики. В настоящее время он недействителен. Раньше он выглядел совсем иначе .