如果我有一个执行以下操作的脚本
[alice]$ math
Enter a number: 5
Number squared: 25
Number divided: 1
Number to power of 3: 125
我想编写另一个脚本,将数学脚本的输出组织到一个表中,但也可以采用多个参数并且不显示“除数”。例如
[alice]$ newprogram 5 10
*
*Number squared power of 3
5 25 125
10 100 1000
此外,数学脚本位于/home/alice
,新程序将位于/home/user
。我该如何处理这个问题?
答案1
看我的回答关于如何将参数传递到现有脚本中的信息,请参阅您之前的问题。解析这一个的输出将比上一个更难。
编写新版本的脚本要简单得多。解析这样的废话是一个主要的 PITA。
这是一个可以做到这一点的版本,并且不会重复打印多余输出(如标题)的原始错误。
#! /bin/bash
for i in "$@" ; do
printf "%i\t%i\t%i\n" $i $(($i * $i)) $(($i * $i *$i))
done
-v
如果您使用(verbose) 选项,这里是一个可以选择打印标题的版本:
#! /bin/bash
verbose=0
while getopts "v" opt ; do
case "$opt" in
v) verbose=1 ;;
esac
done
shift "$((OPTIND-1))"
[ "$verbose" = "1" ] && printf "%s\t%s\t%s\n" 'Number' 'Squared' 'Power of 3'
for i in "$@" ; do
printf "%i\t%i\t%i\n" $i $(($i * $i)) $(($i * $i *$i))
done
答案2
由于问题使用“方法”一词,因此意味着要给出的答案是“粗略”或有些“笼统”,因此我陈述了可以用来解决此问题的以下步骤:
- 写一个预计- 脚本进行争论即将发送至
/home/alice/math
. - 编写一个 BASH 脚本(例如
/home/user/newprogram
),它使用给定 BASH 脚本的参数在循环中调用 Expect 脚本命令替换捕获其输出。 - 使用您最喜欢的文本处理工具,例如
grep
提取所需的数据并将其存储在变量中(为此,您需要将捕获的输出通过管道传输到grep
,再次使用命令替换来捕获命令传递的数据grep
并将其存储在变量中)。 - 将您在本步骤之前的步骤中解析的变量输出到表中。
这些步骤确实假设具有对/home/alice/math
.当然,如果不是这种情况,可以例如:
/home/alice/math
仅使用chmod
或更改权限或所有者chown
。- 将
alice
和user
放在具有足够权限的公共组中,以便两个用户都可以访问/home/alice/math
.