标签: ksh

如何在shell脚本中捕获SQLPlus退出代码?

我有一个KornShell(ksh)脚本,它登录到SQL*Plus并执行脚本.在shell脚本中,我想捕获已执行的SQL语句的状态代码.目前SQL存在错误,我无法通过检查$?来捕获它.如何从sql语句中捕获成功或错误代码并将其传递给shell脚本.

ksh脚本片段:

sqlplus $JDBC_FBUID_U/$JDBC_FBPWD_U@$JDBC_FBDB @${FBC_HOME}/FBCS003.sql ${outputfile}
if [ $? != 0 ]
then
  msg_txt="The execution of Sql script /tmp/FBCS003.sql failed.  Please investigate."
  echo ${msg_txt}
  echo ${msg_txt} | mailx -r ${fromemail} -s "FBCB003: The execution of Sql script /tmp/FBCS003.sql failed." ${toemail}
  epage -n ${pagerdef} ${pagernum} "FBCB003: ${msg_txt}"
  exit 1
fi
Run Code Online (Sandbox Code Playgroud)

SQL脚本FBCS003.sql

-- Set SQLPlus variables.
SET NEWPAGE 0
SET WRAP OFF
SET LINESIZE 9999
SET ECHO OFF
SET FEEDBACK OFF
SET VERIFY OFF
SET HEADING OFF
SET PAGESIZE 0
SET COLSEP …
Run Code Online (Sandbox Code Playgroud)

error-handling shell scripting ksh sqlplus

8
推荐指数
1
解决办法
4万
查看次数

如何使用vi编辑器在KornShell命令行中自动完成

AIX UNIX Version 5.3上的KornShell(ksh)中,编辑器模式设置为vi,使用:

set -o vi
Run Code Online (Sandbox Code Playgroud)

shell命令行中用于自动完成文件或目录名称的键击是什么?

unix vi shell aix ksh

7
推荐指数
1
解决办法
3万
查看次数

Shell脚本用户提示/输入

这是其他人写的粗糙的korn shell脚本.我不太了解使用shell语法,我甚至不确定这是否可行.

有没有办法让我运行这个文件并被提示输入日期,这样我就不必手动进入脚本并每次更改它?

例如,我想将"1/12/09"替换为从用户提示中获取的变量.

#!/bin/ksh
./clear_old
./rooms_xls.pl 1/12/09
cd doors
./doors_xls.pl 1/12/09
Run Code Online (Sandbox Code Playgroud)

variables shell ksh prompt input

7
推荐指数
1
解决办法
2万
查看次数

如何将用户输入的值读入变量

在ksh中,如何提示用户输入值,并将该值加载到脚本中的变量中?

命令行

echo Please enter your name: 
Run Code Online (Sandbox Code Playgroud)

在脚本中

$myName = ?
Run Code Online (Sandbox Code Playgroud)

unix linux ksh

7
推荐指数
2
解决办法
3万
查看次数

是否有适用于Windows的KornShell(ksh)IDE?

我的工作是编写KornShell(ksh)脚本并在远程服务器中运行脚本.我正在努力寻找最佳方法.

目前,我在Notepad ++中编辑代码,将文件传输到服务器(通过FTP),在服务器中运行脚本,然后重复该过程直到脚本运行正常.

所以,我正在寻找的是一个IDE(用于Windows),具有良好的编辑器,ftp支持和调试功能.

unix ssh shell ksh editor

7
推荐指数
1
解决办法
3545
查看次数

bash和ksh之间的子shell差异

我一直认为子shell不是子进程,而是同一进程中的另一个shell环境.

我使用一组基本的内置函数:

(echo "Hello";read)
Run Code Online (Sandbox Code Playgroud)

在另一个终端:

ps -t pts/0
  PID TTY          TIME CMD
20104 pts/0    00:00:00 ksh
Run Code Online (Sandbox Code Playgroud)

所以,kornShell(ksh)中没有子进程.

输入bash,看起来行为不同,给出相同的命令:

  PID TTY          TIME CMD
 3458 pts/0    00:00:00 bash
20067 pts/0    00:00:00 bash
Run Code Online (Sandbox Code Playgroud)

所以,bash中的子进程.
从阅读bash的手册页来看,显然是为子shell创建了另一个进程,但是它伪造了$$,这是一个偷偷摸摸的.

bash和ksh之间是否存在这种差异,或者我是否正确地阅读了这些症状?

编辑:附加信息:strace -f在Linux上运行bash和ksh显示bash clone为sample命令调用两次(它不调用fork).所以bash可能正在使用线程(我试过,ltrace但核心转储!).KornShell既不叫fork,vfork也不clone.

linux bash shell scripting ksh

7
推荐指数
2
解决办法
5444
查看次数

如何防止Linux上的ksh用局部变量覆盖全局变量?

我参与了将包含几个ksh脚本的系统从AIX 6.1移植到SUSE-Linux的过程.我在ksh在两个系统上的行为方式遇到了以下不同之处:

# LocalVar.sh 

test_loc_var()
{ 
typeset -t var 
var=localvariable 
echo "var = $var" 
} 

typeset var=globalvariable 

echo "var = $var" 
test_loc_var 
echo "var = $var"
Run Code Online (Sandbox Code Playgroud)

AIX上的正确结果是:

var = globalvariable 
var = localvariable 
var = globalvariable 
Run Code Online (Sandbox Code Playgroud)

Linux上的错误结果是:

var = globalvariable 
var = localvariable 
var = localvariable 
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 是否有一个环境变量,我可以设置为让Linux的ksh在AIX上表现得像?失败了:
  • Linux的ksh上有选项可以获得所需的行为吗?失败了:
  • 我需要对代码进行哪些更改才能在Linux上获得所需的行为?

注意:

  • 我已经尝试用"local"声明变量,但是在Linux上返回了一个错误,在AIX上它可以工作.

下表总结了这两个系统:

uname -s                 |    Linux                    AIX        
uname -r                 |    2.6.16.60-0.54.5-smp     1
which ksh                |    /bin/ksh                 /usr/bin/ksh
rpm -qa | grep -i ksh    |    ksh-93s-59.11.35         -
lslpp -l | …
Run Code Online (Sandbox Code Playgroud)

linux aix ksh

7
推荐指数
1
解决办法
1016
查看次数

在unix shell脚本中转​​义花括号

我有一个字符串:

{2013/05/01},{2013/05/02},{2013/05/03}

我想在开头附加{,在结尾添加}.输出应该是:

{{2013/05/01},{2013/05/02},{2013/05/03}}

但是,在我的shell脚本中,当我将花括号连接到字符串的开头和结尾时,输出如下:

{2013/05/01} {2013/05/02} {2013/05/03}

为什么会这样?我怎样才能达到我的结果?我确定有一个简单的解决方案,但我是一个unix新手,因此会感激一些帮助.

测试脚本:

#!/usr/bin/ksh 
valid_data_range="{2013/05/01},{2013/05/02},{2013/05/03}"
finalDates="{"$valid_data_range"}"
print $finalDates
Run Code Online (Sandbox Code Playgroud)

unix shell ksh character reserved

7
推荐指数
2
解决办法
1万
查看次数

如何在ksh中检查空字符串

我正在写一个简单的ksh脚本.我必须检查字符串是否为空.怎么办?这就是我所拥有的:

findRes=`find . -name believe | xargs grep -q "ser"`
if [ "${findRes:-unset}" != "unset" ];then

     print "${file}"
fi
Run Code Online (Sandbox Code Playgroud)

ksh

7
推荐指数
1
解决办法
3万
查看次数

为什么ksh在嵌套命令替换期间无法捕获标准错误?

我有以下shell脚本.

$ cat foo.sh 
foo()
{
    A=$(uname)
    printf "hello "
    bogus
}

echo output: "$(foo 2>&1)"
Run Code Online (Sandbox Code Playgroud)

它以bash,zsh,dash和posh生成以下输出.这是有道理的,因为bogus在系统上没有调用这样的命令.

$ bash foo.sh
output: hello foo.sh: line 5: bogus: command not found
$ zsh foo.sh
output: hello foo:4: command not found: bogus
$ dash foo.sh
output: hello foo.sh: 5: foo.sh: bogus: not found
$ posh foo.sh
output: hello foo.sh:8: bogus: not found
Run Code Online (Sandbox Code Playgroud)

但是在Debian上的ksh中,由于调用bogus命令,它不会打印错误消息.

$ ksh foo.sh
output: hello 
Run Code Online (Sandbox Code Playgroud)

什么地方出了错?

如果您想了解系统详细信息和shell的版本详细信息,请参阅以下输出.

$ uname -a
Linux debian1 3.16.0-4-amd64 #1 SMP Debian …
Run Code Online (Sandbox Code Playgroud)

linux shell ksh posix io-redirection

7
推荐指数
1
解决办法
166
查看次数