2016-03-17 8 views
0

Мой сценарий:Переменная не печатается CSH

current = `sqlplus -s $Schemaname/[email protected]$SID <<END 
     set pagesize 0 feedback off verify off heading off echo off; 
     select Count (*) from usr where activeuser='+'; 
     exit; 
     END` 

    set total = 1981 

     echo $total 
     echo $current 

     set y = [ `expr 1981 - $current`] 

     echo $y 

Консоль вывода:

1935 

Ожидаемый результат:

1981 
1935 
46 

Не могли бы вы помочь мне понять, что пошло не так? извинения за то, что я не объяснил это раньше.

+0

Я отформатировал ваш код, пожалуйста, проверьте, не сделал ли я что-то неправильно. Прочитайте [тур] (http://stackoverflow.com/tour). Просьба также описать ожидаемый результат. –

+0

У вас есть несоответствующая обратная сторона на строке 'count = ...'. Трудно сказать, было ли это в оригинале или нет, поскольку обратные ссылки используются для форматирования. –

+0

Я изменил мой вопрос, Пожалуйста, см. Вопрос. – Ganesan

ответ

0

Вы не можете комбинировать многострочный встроенный вход (например, cat <<EOF) с синтаксисом обратной линии. Выходы должны быть на одной линии.

Лучшее, что вы можете сделать, это [от оригинала]:

#!/bin/tcsh -f 

cat > /tmp/data <<END 
set pagesize 0 feedback off verify off heading off echo off; 
select Count (*) from user where activeuser='+'; 
exit; 
END 

set count="`sqlplus -s [email protected] < /tmp/data`" 

rm -f /tmp/data 

set g = 44 

echo $g 
echo $count 

set y = `expr $g - $count` 

echo $y 

UPDATE:

Это не действует в csh:

#!/bin/tcsh -f 
# badsyn 

set val=`head -1 << EOF 
abc 
def 
EOF` 

echo "val is '$val'" 

Он производит синтаксическая ошибка:

Unmatched `. 

Вот ваш последний код с некоторыми примечаниями:

#!/bin/tcsh -f 

# dummy variables 
set Schemaname=foo 
set password=bar 
set SID=10 

# BUG #1 -- csh needs a set command (i.e. "set current=" is correct but 
# "current=" is a syntax error 

# BUG #2 -- you want to capture the sqlplus output so you need to use 
# backticks/virgules ("`") but they must be on the same line 
current= sqlplus -s $Schemaname/[email protected]$SID <<END 
      set pagesize 0 feedback off verify off heading off echo off; 
      select Count (*) from usr where activeuser='+'; 
      exit; 
      END 

    set total = 1981 

     echo $total 
     echo $current 

# BUG #3 -- the brackets aren't valid in csh here 
     set y = [ `expr 1981 - $current`] 

     echo $y 

Это может быть сделано без использования временного файла с помощью два сценариев. Вот первый один:

#!/bin/tcsh -f 
# fix2a 

###set echo verbose 

# dummy variables 
set Schemaname=foo 
set password=bar 
set SID=10 

set current="`./fix2b -s $Schemaname/[email protected]$SID`" 

    set total = 1981 

     echo $total 
     echo $current 

# BUG #3 -- the brackets aren't valid in csh here 
     set y = `expr 1981 - $current` 

     echo $y 

Вот второй один:

#!/bin/tcsh -f 
# fix2b 

# dummy variables since I don't have sqlplus _or_ the database 
alias sqlplus 'echo 1935 ; true' 

sqlplus $argv <<END 
      set pagesize 0 feedback off verify off heading off echo off; 
      select Count (*) from usr where activeuser='+'; 
      exit; 
     END 

Это выход я получаю:

1981 
1935 
46 
+0

в моем коде, все работает. Переменная g и y не печатается. есть ли что-то неправильное с переменной, которую я определил? – Ganesan

+0

Опубликуйте полный код с точным синтаксисом. Кстати, я написал свой первый скрипт csh в 1981 году, чтобы я мог помочь ;-) –

+0

Крейг, я опубликовал свой вопрос для вас. переменные «total» и «y» не печатаются на консоли, что пошло не так? – Ganesan

0

Передача пароля в командной строке представляет собой угрозу безопасности. Лучше запустить SQL * Plus с помощью/nolog, а затем использовать CONNECT.