如何在UNIX sh shell中将文件中的值赋给变量?

时间:2014-10-27 15:05:06

标签: shell unix

我一直在搜索这个网站,试图找到这个问题的答案,并且遇到了几个非常好的答案,不幸的是,它们都没有为我工作。

以下是我正在使用的脚本:

VALUE=`cat szpfxct.tmp`
export VALUE
echo " "                >>$LGFILE
echo "term code " $VALUE >>$LGFILE

打开tmp文件时,我看到一个字符串(201510)应该分配给VALUE。但是,在日志文件中,它会回显"术语代码"显示$ VALUE为空。

该文件的权限正常:-rw-rw-rw- 1 oracle dba 7 Oct 26 21:30 szpfxct.tmp。从命令行单独执行时,命令运行正常。

以下是完整的脚本:

#!/usr/bin/sh

######################################
# Create Log File
######################################

LGFILE=$HOME/szpfxct_$ONE_UP.log
export LGFILE

echo "*********************************" >$LGFILE
echo "Start SZPFXCT Fix Enrollment Counts   " >>$LGFILE
echo "*********************************" >>$LGFILE
echo "    " >>$LGFILE
echo "starting szpfxct" `date` >> $LGFILE

echo $BANUID    >>$LGFILE
echo $PSWD
echo $ONE_UP >>$LGFILE

#####################################
# Retrieve Parameter
#####################################

sqlplus $UIPW @$BANNER_LINKS/szpfxct.sql $ONE_UP 1>> $LOG 2>&1
sqlplus baninst1/[password] <<ENDsql
set echo off
set feedback off
set verify off
set timing off
set showmode off
set time off
set pagesize 60
set serveroutput on size 1000000;

clear breaks
clear computes
ttitle off

DECLARE

    output_file       utl_file.file_type;
    term_code         stvterm.stvterm_code%TYPE;

BEGIN
   output_file := utl_file.fopen('/export/home/jobsub','szpfxct.tmp','w');
    SELECT substr(gjbprun_value,1,6)
      into term_code
      from gjbprun
     where gjbprun_job = 'SZPFXCT' and
           gjbprun_number = '01' and
           gjbprun_one_up_no = $ONE_UP;

   utl_file.put_line(output_file, term_code);

   utl_file.fclose_all;
END;
/
ENDsql
#TPS
chmod 777 szpfxct.tmp
VALUE=`cat szpfxct.tmp`
export VALUE
echo " "                >>$LGFILE
echo "term code " $VALUE >>$LGFILE

3 个答案:

答案 0 :(得分:1)

试试这个。它可能会让您了解您遇到的问题:

VALUE="`cat szpfxct.tmp 2>&1`"
echo "term code '$VALUE'"
term code  'cat: szpfxct.tmp: No such file or directory'

在这个例子中,我强制文件不存在。此外,如果变量真的是空的,你会意识到它,因为每边都会有单引号。如果它只是空格,则引号之间会有一个或多个空格。

我建议这样做,因为在某些脚本中,stderr可能已被发送到您不再看到的地方。如果您的脚本中有所有这些显示的行,那么我无法解释为什么您不会看到stderr输出。另外,可能有用的是让我们知道你正在使用哪个shell解释器。我试过sh和bash,但我无法复制你的问题。这就是为什么我希望这一改变能提供更多信息。如果没有,也试试这个:

VALUE="`pwd ; cat szpfxct.tmp 2>&1`"

也许你不在你期望的目录中,并且该目录也有这样的文件,但它是空的。

答案 1 :(得分:0)

尝试获取您的文件 让我们说szpfxct.tmp的值是

VALUE = 100

在你的shell scriot中你可以做这样的事情

#!/usr/bin/bash
#either 
source szpfxct.tmp
#or
. .szpfxct.tmp
echo $VALUE

答案 2 :(得分:0)

使用sh(bourne shell)

来源文件
. /path-to-file/filename 

应该有效