VERSION="4.0beta12"
NEXT_VERSION=?????
Run Code Online (Sandbox Code Playgroud)
编写自动发布脚本,我在变量 $VERSION 中有当前版本,我想将下一个版本计算为 $NEXT_VERSION。
规则:增加字符串末尾的整数。
4.0beta12?4.0beta13
4.2alpha9 ? 4.2alpha10
我已经尝试过 sed/awk/eval 但不能让它工作。想法?任何工具都可以。
我将如何创建一个用户可以用来对任意数量的命令行参数求和的 bash 脚本?例如,假设我的脚本名为 sum:
sum 3
Run Code Online (Sandbox Code Playgroud)
3
sum 3 5
Run Code Online (Sandbox Code Playgroud)
8
sum 9 8 21
Run Code Online (Sandbox Code Playgroud)
38
依此类推..我意识到我将不得不遍历命令行参数并将它们增加到总数,但我不确定如何做到这一点。我不确定如何将第二个命令行参数引用到特定变量或如何获取总命令行参数的数量。
当我将 MB 转换为 GB 时,我的输出低于输出。我想要正常格式的输出。当我使用时,bc我收到一个错误。文本文件包含近 100 行这样的行。
我想在正常输出中打印它,(不带符号):
1.14441e-07
4.95911e-07
3.05176e-07
1.90735e-07
3.05176e-07
Run Code Online (Sandbox Code Playgroud)
命令:
$ DIVISOR=104857600
$ sudo du --max-depth=1 /home/xxx | tail -1 | \
awk -v DIVISOR=104857600 '{print $1/DIVISOR}'
1.14441e-07
Run Code Online (Sandbox Code Playgroud) 我只是想将字符串转换$RECORD_HDR为数字$RECORD_SIZE,其中
echo $RECORD_HDR给出 003D 并且
echo $RECORD_SIZE应该给出 61
在 Bash 和 Dash 中,在算术扩展中使用引号是非法的:
$ bash -c 'x=123;echo $(("$x"))'
bash: "123": syntax error: operand expected (error token is ""123"")
$ dash -c 'x=123;echo $(("$x"))'
dash: 1: arithmetic expression: expecting primary: ""123""
Run Code Online (Sandbox Code Playgroud)
Bash 在作为 sh 调用时给出相同的错误。不过,Ksh 和 FreeBSD 的 Bourne Shell 并不介意:
$ ksh -c 'x=123;echo $(("$x"))'
123
$ sh -c 'x=123;echo $(("$x"))'
123
Run Code Online (Sandbox Code Playgroud)
根据Bash 参考手册:
该表达式被视为在双引号内,但括号内的双引号不会被特殊处理。所有代币……都经过……报价删除。
(这与POSIX所说的基本相同。)
最后,$(( ))与其他算术上下文(( ))(例如,在条件表达式中)相比,Bash 的处理方式有所不同。后者用引号很好。
要么我不明白这里的引用删除意味着什么,要么这是其中一些 shell 实现中的错误。如果是前者,“引用删除”实际上是什么意思?或者,这只是一个错误?
假设我有这两个输入文件:
> file1
2
3
4
> file2
10
100
1000
Run Code Online (Sandbox Code Playgroud)
我想为每一行计算:file1/file2,结果是file3:
> file 3
0.2
0.03
0.004
Run Code Online (Sandbox Code Playgroud)
bash 中的划分可以通过以下方式实现: $((file1_line/file2_line))
我阅读了有关如何让 bc 打印第一个零的主题,但这并不是我想要的。我想要更多...
我想要一个返回带有八位十进制数字的浮点数的函数。我对任何解决方案持开放态度,使用 awk 或任何公平的方法。一个例子将说明我的意思:
hypothenuse () {
local a=${1}
local b=${2}
echo "This is a ${a} and b ${b}"
local x=`echo "scale=8; $a^2" | bc -l`
local y=`echo "scale=8; $b^2" | bc -l`
echo "This is x ${x} and y ${y}"
# local sum=`awk -v k=$x -v k=$y 'BEGIN {print (k + l)}'`
# echo "This is sum ${sum}"
local c=`echo "scale=8; sqrt($a^2 + $b^2)" | bc -l`
echo "This is c ${c}"
}
Run Code Online (Sandbox Code Playgroud)
有时,a并且b …
我在课堂上向我的学生展示了一段有趣的代码(或者我认为是这样),令我惊讶的是,它在zsh. 然后我切换到bash它并按预期工作。
代码如下:
[ $(( $RANDOM % 6 )) == 0 ] && echo "Boom" || echo "Click"
Run Code Online (Sandbox Code Playgroud)
在bash它打印Boom或Click随机,符合市场预期。但在zsh我收到以下错误消息:
zsh: = 未找到
谁能解释一下有什么区别?据我了解,两个 shell 都应该以等效的方式解释脚本。
谢谢。
我认为下面的行应该以不同的方式编写,并且该命令应该会出错。
$ echo $((x=2, y=3, x+y))
5
Run Code Online (Sandbox Code Playgroud)
我认为写这个的方法是:
$ echo $((x=2, y=3, $x+$y))
5
Run Code Online (Sandbox Code Playgroud)
两者都有效,这现在让我感到困惑。我假设我在某个地方有误解,所以我将解释我如何确定第一个回声是错误的。x+y 没有引用变量,所以 bash 怎么可能知道 x 和 y 是变量。如果你告诉我这是因为表达式开头的 $ ,那么你一定是错的,因为 x 和 y 会被定义在 $x=2 和 $y=2 处,这将是定义变量的不正确方法。所以我完全不知道 bash 如何知道 x 和 y 是变量。
我想通过每次运行特定sed行时将该数字递增 1 来更改字符串末尾的数字。
字符串如下所示:
server-port=25555
Run Code Online (Sandbox Code Playgroud)
我想我可以运行类似这sed条线的东西来做到这一点,但它不起作用。
sed -i 's/port=[0-9]{5}/int(&+1)/'
Run Code Online (Sandbox Code Playgroud)