我对shell脚本不太熟悉。我想为以下伪代码编写一个shell脚本:
min=some garbage value
for(i=1 to N){ // N and n will be taken as input for the shell script.
for(j=1 to n){
val= './a.out' // call the executable a.out and take the output in val
if(val<min) // a.out is a random number generator script
min=val;
}
arr[k++]=min;
}
// Then I want to calculate the sum of the elements of the array 'arr'.
Run Code Online (Sandbox Code Playgroud)
如何通过 shell 脚本执行这些操作?
a.out是这样的,它将产生一串数字作为输出。我必须将此字符串转换为变量val。这该怎么做?例如,作为输出a.out生成12.34但是12.34是字符数组而不是浮点数。我想将其转换为通过 shell 脚本浮动,但我无权更改a.out …
我有一个正在编写的 cron,它将每小时重复一次,我需要一种简单的方法将计数器从上次运行传递到下一次运行。
我的计划是在最后将数字添加到文件中,然后在开头调用它,例如
在第一次 cron 运行结束时:
INC_COUNT=1
echo $INC_COUNT > inc_counter.txt
Run Code Online (Sandbox Code Playgroud)
然后在第二次运行开始时:
INC_COUNT_FILE="inc_counter.txt"
OLD_INC_COUNTER=$(cat "$INC_COUNT_FILE")
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利,但现在我需要增加这个数字。我试过:
NEW_INC_COUNTER="$OLD_INC_COUNTER"+1
NEW_INC_COUNTER="$OLD_INC_COUNTER+1"
Run Code Online (Sandbox Code Playgroud)
两者都没有奏效。增加这个数字的最佳方法是什么?
好的,所以我想我可能在……某事上发现了一个缺陷。老实说我不知道。这是一个多么奇怪的场景。
我试图破解非常小的非对称 (RSA) 加密,就像我的一个朋友的概念证明项目一样。对于那些不太了解 RSA 的人,我将在这里介绍一些重要的事实。如果您已经了解 RSA,请跳过以下段落:
RSA 是一种非对称加密算法(也称为公钥/私钥密码术)。这意味着有 2 个密钥:公共和私有。任何一个都可以用来加密,但只有另一个密钥才能解密。所以如果我用私钥加密一个小文本文件,只有公钥可以解密它。这在密钥交换中很有用。这是通过使用称为素数分解的数学原理来实现的(将两个素数相乘很容易,但从乘积中分解出原始的 2 个素数却很困难)。所以想象一下你的公钥可以加密,但只有你的私钥可以解密。你的私钥有 2 个质数,你的公钥有这 2 个质数的乘积(模数)。有人能够解密使用公钥加密的数据的唯一方法是将模数分解为 2 个素数并对私钥进行逆向工程。这就是我试图做的,但规模很小。
是的,所以质因数分解!那就是我正在做的。我生成了一个 128 位 RSA 密钥(就非对称加密而言很小,特别是考虑到我的笔记本电脑中的 2GHz 处理器在一秒钟内将其分解)。我提取了模数,并在将其从十六进制转换为十进制时使用了不正确的命令(使用 bc 时忘记选择 ibase),结果为 97964999429910939982995739699617。然后我使用了因子命令。
这就是事情变得时髦的地方。
当我考虑它时,我得到了8 个答案,而不是我期望的 2 个。
97964999429910939982995739699617:3 3 3 17 433 613 937 858164002128703934431
现在想想,我明白为什么我没有得到 2 个答案:这不是 RSA 密钥对的真正模数。但这不是我发现的“错误”(否则你不会读到这个)。
为了仔细检查,我决定将这些数字相乘以再次获得模数。
我使用了命令
回声 $((3*3*3*17*433*613*937*858164002128703934431))
好吧,这肯定会导致再次开始编号,对吗?没有理由不应该是 97964999429910939982995739699617。
好吧,这就是我的思路,直到我得到答案 -8628928582186374751。
我完全不知道为什么这个命令会返回一个如此明显错误的答案。它怎么可能是负面的?这是本机数学函数中的故障吗?factor 命令是正确的,我知道这是肯定的,因为当我尝试使用真实的物理计算器 (TI-84) 时,它确实返回了我最初分解的值。
我首先在我的笔记本电脑上尝试了这个命令(运行 Kali Linux。命令“uname -rvo”告诉我“4.3.0-kali1-amd64 #1 SMP Debian 4.3.3-5kali4 (2016-01-13) GNU/Linux ”)。然后我远程连接到我高中的 Gentoo 服务器并运行相同的命令。同样,显然无效的答案。Uname 说“4.1.15-gentoo-r1 #2 SMP Fri Mar …
awk 算法和 expr 之间有一些对比输出。
例子
expr 11111111111111111111 / 22
Run Code Online (Sandbox Code Playgroud)
给
505050505050505050
Run Code Online (Sandbox Code Playgroud)
但是使用 awk:
echo '11111111111111111111' | awk '{q=$1/22;;print q}'
Run Code Online (Sandbox Code Playgroud)
给
505050505050505024
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗?
所以我有以下内容
cat a1 | wc -l // term1
cat a2 | wc -l // term2
cat a3 | wc -l // term3
...
cat a10 | wc -l // term10
Run Code Online (Sandbox Code Playgroud)
我想term1 + term2 + ... + term10用单行进行计算(如果很长也可以)。理想情况下我想得到
$(cat a1 | wc -l) + ... $(cat a10 | wc -l)
Run Code Online (Sandbox Code Playgroud) 当我在中尝试以下表达式时,bash收到一条奇怪的错误消息:
[: -lt: unary operator expected
Run Code Online (Sandbox Code Playgroud)
首先是函数定义
some_func () {
(( 3 + 5 ))
}
Run Code Online (Sandbox Code Playgroud)
还有表情
[ $(some_func) -lt 10 ] && true
Run Code Online (Sandbox Code Playgroud)
我想问题是将运算符-lt与命令替换和/或算术扩展混合在一起?
退出代码$?为 2,消息为an unary op was expected。
我想输入一个数字,然后加税并减去折扣。
我在尝试:
#!/bin/sh
...
final_amount = $(echo "$purchase_amount+($purchase_amount * $tax)-($purchase_amount * $discount)" |bc -l)
...
Run Code Online (Sandbox Code Playgroud)
但我得到:
$ . 3_purchase_amounts.sh
...
final_amount: command not found
...
Run Code Online (Sandbox Code Playgroud) 在 Bash 中,我使用了一个需要算术表达式的字符串:
$ (( hello ))
$ echo $?
1
$ echo $(( hello ))
0
$ let aaa=hello
$ echo $?
1
$ echo $aaa
0
Run Code Online (Sandbox Code Playgroud)
没有报告错误。那么字符串是算术表达式吗?如果是,字符串的值是否始终为 0?
我的问题来自评论为什么命令不能与以赋值开头的命令一起工作?
变量可以用花括号保护。
Mynewvar=1
echo $Mynewvar
1
echo ${Mynewvar}
1
Run Code Online (Sandbox Code Playgroud)
但是,在 shell 内算术时我无法再保护它们。
Mynewvar=1
echo $((Mynewvar+9))
10
echo $(({Mynewvar}+9))
Run Code Online (Sandbox Code Playgroud)
bash: {Mynewvar}+9: syntax error: operand expected (error token is "{Mynewvar}+9")
Run Code Online (Sandbox Code Playgroud)
当变量名在 shell 算术中时,包围变量名的正确方法是什么?
arithmetic ×9
bash ×6
shell ×5
variable ×3
shell-script ×2
awk ×1
cryptography ×1
expr ×1
math ×1
test ×1
utilities ×1