我正在学习 shell 编程的基础知识,所以我写了一些简单的东西,比如
#!/bin/bash
read var1
read var2
if [ var1 -lt var2 ]; then
echo "var1 is lt var2"
else
echo "var2 is lt var1"
fi
Run Code Online (Sandbox Code Playgroud)
我的理解是变量在 Bash 中是无类型的,并且任何变量如果只包含数字就可以用作整数。但是当我运行它时,我收到错误“预期的整数表达式”......为什么?
我们可以在冒号后使用 bash 的条件运算符和赋值运算符吗?
Bash 参考手册解释了算术运算符如下。
expr ? expr : expr= *= /= %= += -= <<= >>= &= ^= |=首先,这段代码似乎运行良好:
a=1; ((a? b=1 : 2 )) #seems to work
Run Code Online (Sandbox Code Playgroud)
但是当我在 之后使用赋值运算符时:,我得到了“尝试赋值给非变量”错误:
a=1; ((a? b=1 : c=1)) #attempted assignment to non-variable error
Run Code Online (Sandbox Code Playgroud)
为什么我们只能在冒号前使用赋值运算符?
鉴于以下data文件...
foo 10
bar 20
oof 50
rab 20
Run Code Online (Sandbox Code Playgroud)
...我如何将第二列打印为第二列总数的百分比?换句话说,我想要...
foo 10 10%
bar 20 20%
oof 50 50%
rab 20 20%
Run Code Online (Sandbox Code Playgroud)
...当然,数字不太明显。我可以很容易地创建一个运行总数,但我不确定如何在打印行之前计算总数。我在 awk 文件中执行此操作totals.awk...
#!/usr/bin/awk -f
BEGIN{
runningtotal=0
}
{
runningtotal=runningtotal+$2
print $1 "\t" $2 "\t" runningtotal "\t" $2/runningtotal
}
Run Code Online (Sandbox Code Playgroud)
所以,运行./totals.awk data收益...
foo 10 10 1
bar 20 30 0.666667
oof 50 80 0.625
rab 20 100 0.2
Run Code Online (Sandbox Code Playgroud)
有没有办法循环两次,一次计算总数,一次打印行?这在 AWK 中是可能的,还是我必须使用其他实用程序?
我正在尝试计算以太网接口上使用的带宽(1000 Mbit/s)。为了测试我的脚本,我使用iperf工具来生成巨大的带宽。
我现在面临的问题是,当eth0_rx1与eth0_rx2变得其比最大32位的值大的值。我得到的差异为 0。
不知何故
printf 'eth0 Download rate: %s B/s\n' "$((eth0_rx2-eth0_rx1))"
Run Code Online (Sandbox Code Playgroud)
给出了正确的值,但是当尝试使用
eth0_diff=expr $eth0_rx2 - $eth0_rx1
Run Code Online (Sandbox Code Playgroud)
我得到的值为 0。
有没有办法处理超过 32 位rx_bytes或tx_bytes超过 32 位的情况?
我不确定这是计算已用带宽的优雅方法。如果没有,请建议其他替代方法。
示例输出:
eth0_rx1 = 2134947002 \
eth0_rx2= 2159752166 \
eth0 Download rate: 24805164 B/s \
eth0_diff = 12536645 \
eth0_rx_kB = 12242 \
eth0_rx_kB_100 = 1224200 \
eth0_rx_kB_BW = 9
eth0_rx1 = 2159752166 \
eth0_rx2= 2184557522 \
eth0 Download rate: 24805356 B/s \
eth0_diff = 0 …Run Code Online (Sandbox Code Playgroud) 我有一个处理小时和分钟的简单脚本。
如果我想计算自午夜以来有一个字符串的分钟数,hh:mm我尝试拆分字符串然后做hh * 60 + mm
我的问题是,虽然
$ (( tot = 12 * 60 + 30 ))
$ echo $tot
750
Run Code Online (Sandbox Code Playgroud)
反而
$ (( tot = 09 * 60 + 30 ))
bash: ((: tot = 09: value too great for base (error token is "09")
Run Code Online (Sandbox Code Playgroud)
据我了解,字符串09不应作为基数为 10 的数字。
有没有比简单地删除字符串中的前导零更好的方法?
我正在寻找我遇到的 Bash 4 问题的解决方案。
Bash 4 能够使用前导零进行迭代。
对于线路:
for i in {001..005}; do echo -n $i" ";done;echo
Run Code Online (Sandbox Code Playgroud)
输出是
001 002 003 004 005
Run Code Online (Sandbox Code Playgroud)
但是当我尝试这个时:
a="005"; for i in {001..${a}}; do echo $i;done
Run Code Online (Sandbox Code Playgroud)
或类似的东西,结果是:
{001..005}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
我在bash脚本中有命令从源文本文件中获取数据,然后将变量的值添加到它并在 if/else 条件下使用它。
源数据文件 ( db_count.ini) (注意:双引号内包含空格):
db_ctdy_sr=" 7"
Run Code Online (Sandbox Code Playgroud)
脚本:
source db_count.ini
# Removing the whitespace on the stored data
n_db_sr=${db_ctdy_sr// /}
# Sum
c=0
b=7
echo "Value of db:"$n_db_sr
sm=$((n_db_sr + c))
echo "The value of db:"
echo "$sm"
echo $sm
if [ "$sm" = "$b" ]
then
echo "Success."
else
echo "Not."
fi
echo "Bye!"
Run Code Online (Sandbox Code Playgroud)
但是当我运行脚本时,它总是我这个
The value of db:7
") Syntax error Invalid arithmetic operator (error token is "
The value of:
Not.
Bye! …Run Code Online (Sandbox Code Playgroud) 有时我需要运行一些数学运算。我知道我可以使用bc或echo $(( 6/2 ))。我创建了自己的函数bc来读取输入。但有时需要很长时间才能输入:_bc "6/2"。所以我有这个问题:
有没有办法教 zsh/bash 如何在命令行中对数字运行数学运算?一个例子超过数千个单词。
$ 6/2
$ 3.0
Run Code Online (Sandbox Code Playgroud)
这意味着 zsh/bash 必须识别数字并调用 ie bc。
执行命令后declare -i a=5,命令a+=2成功,但命令a-=2失败。有人可以解释 bash 的这种奇怪行为吗?
输入将是如下文件名:
A-B-000001-C
A-B-000002-C
.....
.....
A-B-999999-C
Run Code Online (Sandbox Code Playgroud)
所有文件应该是连续的。我想找到丢失的连续文件名。为此,我使用awk分隔 6 位序列号 ,并使用grep和正则表达式来检查文件是否存在于目录中。
`ls|grep "A-B-${sequencenumber}-.*"|wc -l`
Run Code Online (Sandbox Code Playgroud)
但 shell 脚本不会将数字视为十进制,如果我使用10#$sequencenumber强制将数字视为十进制,那么它会删除搜索文件所需的前面的零。
有没有办法解决?