2014-11-18 9 views
-1

Есть ли какой-нибудь учебник, чтобы узнать, как перевести код из bash в ksh? Как я могу написать эту строку кода в korn?От bash до ksh

export TYPE_CANAL=$(echo $TYPE | sed "s/${TYPE_APACHE// /\\|}//g") 

Последний раз редактировалось:

Объяснение строки кода:

Если TYPE_APACHE является "абв BCD", то $ {TYPE_APACHE ///\ |} будет "абв \ | BCD". Расширение переменной с использованием double // является глобальной заменой символа «» (символа пробела) на \ |

У меня есть две переменные ($ TYPE и $ TYPE_APACHE). Все значения в $ TYPE_APACHE включены в $ TYPE. Я хочу новую переменную с именем TYPE_CANAL_TMP со всеми значениями, исключая те, которые находятся в $ TYPE_APACHE.

+0

Я не знаю KornShell. Но KornShell совместим с Bash, вы изменили #! Shebang? – johnnyevolunium

+0

См. Также http://stackoverflow.com/questions/26761744/do-sed-to-delete-only-if-exist-variable – tripleee

+1

@johnnyevolunium 'ksh' и Bash не являются взаимно совместимыми. Существуют функции Bash-only, которые недоступны в 'ksh' и наоборот. – tripleee

ответ

0

Ваша команда не указала $TYPE должным образом, чтобы она провалила любые пробелы в отдельные пробелы. Это намеренно? Я предполагаю, что нет, и изменил эту часть кода.

Команда принимает любое пространство в $TYPE_APACHE и заменяет его \\|, а затем передает это значение sed в качестве обычного выражения для удаления строк. Это может быть сделано переносимо с

TYPE_CANAL=$(echo "$TYPE" | sed "s/$(echo "$TYPE_APACHE" | sed 's/ /\\|/')//g") 
export TYPE_CANAL 

В Bash, это можно было бы сделать гораздо больше элегантно с массивами, которые поддерживаются в ksh, как хорошо, но без правильного описания проблемы этого кода предполагается решить, слишком много мест, которые мы должны были бы догадаться.

0

В следующий раз, пожалуйста, отправьте пример ввода и вывода. Я думаю, что вы хотите следующее:

TYPE="a1 a2 a3 a4 a5 a6" 
TYPE_APACHE="a2 a4 a5" 

TYPE_CANAL_RAW="" 
for type in ${TYPE}; do 
    echo ${type} 
    if [[ ${TYPE_APACHE} != *${type}* ]]; then 
     TYPE_CANAL_RAW="${TYPE_CANAL_RAW} ${type}" 
    fi 
done 
TYPE_CANAL=${TYPE_CANAL_RAW# } 

Я думаю, что вы должны сделать функцию из кода выше, а не пытаться , чтобы избежать для цикла. Когда вам действительно нужно, чтобы изменить его, вы должны сделать СЭД строка выглядеть

echo ${TYPE} | sed -e 's/a2//' -e 's/a4//' -e 's/a5//' -e 's/ */ /g' 

Будьте в курсе специальных символов в TYPE_ARCHIVE при попытке использовать СЭД.

Смежные вопросы