2014-01-16 11 views
2

в оболочке по умолчанию для цикла, приведенной нижеИзменение оболочки внутри сценария оболочки

for ((i=$llimit; i<=$ulimit; i++)); 
do 
    echo $i 
done; 

он выдает ошибку «„((“не ожидается»

, но при переходе на Баш оболочки

для цикла работает отлично

есть способ изменить оболочку внутри shellscript

или любое другое решение, так как это цикл находится внутри сценария оболочки

EDIT:

это HTE сценарий оболочки

#!/bin/bash 
nav_var=`sqlplus -s tcs384160/tcs#1234 <<\EOF 
set pagesize 0 feedback off verify off heading off echo off 
select max(sequence#) from v$archived_log where applied='YES' and thread#=2 and  dest_id=2; 
exit; 
EOF` 
echo $nav_var; 
ulimit=`expr $nav_var - 30`; 
llimit=`expr $ulimit - 200`; 
for ((i=$llimit; i<=$ulimit; i++)); 
do ls -l arch_aceprod_2_${i}_743034701.arc; 
done; 
+2

Как правило, это так называемые притон линии (например, '#/USR/бен!/env bash' как первая строка), который контролирует, какая оболочка выполняет скрипт. Что это в вашем случае? Можете ли вы просто изменить его на bash? – mklement0

+0

из домашнего каталога typing bash заставляет его менять оболочку, чтобы bash оболочка по умолчанию, я думаю, это ksh – user3186568

ответ

2

Цикл C-стиль for вы использовали это bashism.

Измените строку

for ((i=$llimit; i<=$ulimit; i++)); 

в

for i in $(seq $llimit $ulimit); 

и это будет хорошо работать как с sh и bash.


EDIT: Если вы не имеете seq, вы могли бы изменить цикл, как:

i=$llimit 
while [ $i -le $ulimit ]; do 
    echo "Do something here" 
    let i=i+1 
done 
+0

ошибка выброшена seq: не найден. – user3186568

+0

@ user3186568 См. Править выше для другого варианта. – devnull

+0

, который работал благодаря – user3186568

0

По «умолчанию оболочка» Я предполагаю, что вы имеете в виду/bin/ш? Есть ли строка, начинающаяся с "#!" наверху скрипта?

Bash в значительной степени обратно совместим с sh. Если вы поместите «#!/Bin/bash» (без кавычек) в качестве первой строки, это должно заставить все работать под bash.

+0

по-прежнему та же ошибка – user3186568

+0

default shell is ksh – user3186568

-2

попробовать другой для синтаксиса цикла

for counter in {$llimit..$ulimit} 
do 

your logic 

done 

это работает для всех типов оболочек.

Или #! Бен/Баш также будет работать в вашем случае

+2

Знаете ли вы, что расширение брекета происходит до расширения переменной и что этот __won't__ работает? – devnull

+0

arch_aceprod_2_ {170801..171001} _ *. Arc не найден – user3186568

+0

Единственная оболочка, о которой я знаю, поддерживает это 'zsh'. – chepner

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