我有一个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) 在AIX UNIX Version 5.3上的KornShell(ksh)中,编辑器模式设置为vi,使用:
set -o vi
Run Code Online (Sandbox Code Playgroud)
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) 在ksh中,如何提示用户输入值,并将该值加载到脚本中的变量中?
命令行
echo Please enter your name:
Run Code Online (Sandbox Code Playgroud)
在脚本中
$myName = ?
Run Code Online (Sandbox Code Playgroud) 我的工作是编写KornShell(ksh)脚本并在远程服务器中运行脚本.我正在努力寻找最佳方法.
目前,我在Notepad ++中编辑代码,将文件传输到服务器(通过FTP),在服务器中运行脚本,然后重复该过程直到脚本运行正常.
所以,我正在寻找的是一个IDE(用于Windows),具有良好的编辑器,ftp支持和调试功能.
我一直认为子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.
我参与了将包含几个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)
我的问题是:
注意:
下表总结了这两个系统:
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) 我有一个字符串:
{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) 我正在写一个简单的ksh脚本.我必须检查字符串是否为空.怎么办?这就是我所拥有的:
findRes=`find . -name believe | xargs grep -q "ser"`
if [ "${findRes:-unset}" != "unset" ];then
print "${file}"
fi
Run Code Online (Sandbox Code Playgroud) 我有以下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)