这是我的 Unix shell 脚本代码
#! /bin/ksh
echo "Enter your first number:"
read first
echo "Enter your second number:"
read second
echo "Enter your third number:"
read third
SUM=`expr $first + $second + $third`
AVERAGE="$SUM/3"
echo "The average is $AVERAGE"
Run Code Online (Sandbox Code Playgroud)
基本上我想找到用户输入的 3 个值的平均值。输入所有值后得到的结果,例如所有值加起来为 12;是“平均值是12/3”。
在尝试破译我现在公司的前雇员编写的一些脚本时,在许多脚本中,我遇到了以下语句,这些语句将变量分配给一些命令,如下所示:
CAT=cat
GREP=grep
SED=sed
Run Code Online (Sandbox Code Playgroud)
在脚本的后面,我看到他们使用了这些变量而不是常规命令:
$GREP -v "^#" `dirname $0`/abcdfilename | while read line
do
<some loop operations>
done
Run Code Online (Sandbox Code Playgroud)
我没有看到使用这个变量而不是grep直接使用的意义。我的问题是:
当我运行该ksh命令时,它作为非登录 Shell 运行(如预期的那样)。我想要实现的是ksh作为登录 Shell运行,就像使用bash.
作为参考,bash可以通过指定-l选项,将其视为已作为登录 shell 调用。这是 bash 手册页的摘录:
Run Code Online (Sandbox Code Playgroud)BASH(1) BASH(1) NAME bash - GNU Bourne-Again SHell . . . OPTIONS . . . -l Make bash act as if it had been invoked as a login shell (see INVOCATION below).
这是我在 AIX 服务器中看到的手册页的链接:
http://www.ibm.com/support/knowledgecenter/ssw_aix_71/com.ibm.aix.cmds3/ksh.htm
有一个选项可以禁用$HOME/.profile文件处理(请参阅下面的引用),因此必须有一种方法可以将 KornShell 用作登录 shell。
Run Code Online (Sandbox Code Playgroud)ksh Command Purpose Invokes the Korn shell. . . . Flags . . . -p Disables the processing of …
我有一个数组,其中每个元素都可能包含另一个变量。数组分配来自文件,如下所示:
FILE_CLEANUP_DIR_ARR=($(cat cleanup.list | sed '/^[[:blank:]]*$/d' | sed '/^[#]/d'))
Run Code Online (Sandbox Code Playgroud)
如何使用扩展变量恢复数组。
TARGET_DIR=/SOMEROOTDIR
FILE_CLEANUP_DIR_ARR[0]从字面上看具有价值$TARGET_DIR/SOMESUBDIR0
FILE_CLEANUP_DIR_ARR[1]从字面上看具有价值$TARGET_DIR/SOMESUBDIR1
如何将此 FILE_CLEANUP_DIR_ARR 恢复为扩展变量,如下所示。
FILE_CLEANUP_DIR_ARR[0] = /SOMEROOTDIR/SOMESUBDIR0
FILE_CLEANUP_DIR_ARR[1] = /SOMEROOTDIR/SOMESUBDIR1
示例代码。不工作。
i=0
for CDIR in "${FILE_CLEANUP_DIR_ARR[@]}";
do
FILE_CLEANUP_DIR_ARR[i]="$CDIR"
((i++))
done
Run Code Online (Sandbox Code Playgroud) 我在 ksh 中有以下行代码:
echo -e "$SUBJECT"|/usr/sbin/sendmail -f XXXXXX@gmail.com -t XXXXXX@gmail.com
Run Code Online (Sandbox Code Playgroud)
但我仍然$SUBJECT在身体里,而不是真正的主题。它出什么问题了?
我正在 AIX 7.2 上运行 ksh 脚本。
在调试模式下,我想将所有脚本执行的操作重定向到 brkpt 文件。
该脚本还登录另一个应用程序,因此使用密码(假设“pw123_”)
exec > $brkpt_file 2>&1
set -xv
dsmadmc -id=admin -pa=pw123_ q pr
Run Code Online (Sandbox Code Playgroud)
重定向工作正常,但我想用“***”替换密码字符串,以便它在 brkpt 文件中永远不可见。
这在命令行上工作得很好:
echo "dsmadmc -id=admin -pa=pw123_ q pr" | sed "s/-pa=[[:graph:]]* /-pa=*** /g"
result
dsmadmc -id=admin -pa=*** q pr
Run Code Online (Sandbox Code Playgroud)
但是一旦我将这个“sed”与“exec”结合使用:
a)输出不再重定向到文件,而是在屏幕上
b)密码字符串不会被替换
exec | sed 's/-pa.*=[[:graph:]]* /pa=*** /g' > $brkpt_file 2>&1
set-xv
dsmadmc -id=admin -pa=pw123_ q pr
result
+ dsmadmc -id=admin -pa=pw123_ q pr
+ ... other stuff of script
Run Code Online (Sandbox Code Playgroud)
如何获取 brkpt 中的所有脚本内容并隐藏密码?
0:root@SERVER:/root # echo "something" | sed -e 's/^/\t/g'
tsomething
0:root@SERVER:/root #
Run Code Online (Sandbox Code Playgroud)
AIX/ksh .. 为什么它不起作用?我只想在每一行之前放一个“标签”!
在以下代码段中,$2awk 返回空。我究竟做错了什么?我试图找到 MAX 和 MIN 之间的区别。
#!/bin/ksh
if [ $# -ne 1 ]; then
echo "Usage: sh `basename ${0}` filename";
exit 1;
fi
if [ ! -s ${1} ]; then
echo "file doesn't exist or is empty";
exit 1;
fi
sed -e '/^$/d' -e '/^#/d' ${1} |
awk -F'=' '
BEGIN {
MIN=$2; MAX=$2; print MIN;
}
{
if ( $2 > MAX )
{
MAX = $2;
}
else if ( $2 < MIN )
{
MIN …Run Code Online (Sandbox Code Playgroud) 我对重定向有一个非常基本的了解,但是我遇到了一个带有我不理解的重定向的 cronjob。
00 19 * * 1-5 /apps/app/scripts/doit.sh a np cron > /apps/app/scripts/doit.log > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)
我看到三个重定向。我打算在这里写下我的最佳猜测,但我无法形成全貌。如果有人帮助我理解 STDOUT 和 STDERR 术语,我将不胜感激。
我的外壳是 ksh:
:> ps -p $$
PID TTY TIME CMD
23947 pts/0 00:00:00 ksh
Run Code Online (Sandbox Code Playgroud) 除了 ksh。是否有可能在没有任何痛苦的情况下做到这一点(正则表达式)?