有时我需要将一个数除以另一个数。如果我可以为此定义一个 bash 函数,那就太好了。到目前为止,我被迫使用诸如
echo 'scale=25;65320/670' | bc
Run Code Online (Sandbox Code Playgroud)
但如果我能定义一个看起来像的 .bashrc 函数就太好了
divide () {
bc -d $1 / $2
}
Run Code Online (Sandbox Code Playgroud) 我正在为 Linux 编写一个 shell 脚本,使用 Bash,将任何视频文件转换为 MP4。为此,我将avconvwithlibvorbis用于音频。
在我的脚本中,我有一个问题要问用户:
read -p "- Audio Quality [scale from -2 to 10] ? "
if [ -n "$REPLY" ] ; then
ABITRATE="-aq $REPLY"
fi
Run Code Online (Sandbox Code Playgroud)
我的“ABITRATE”字符串进入最终的avconv命令行。
但我想让用户有机会用 Kb(千位)值来回答这个问题,并将其转换为libvorbis使用的比例。“从 -2 到 10 的比例”是这样的:
Quality Kbit/s Normalization
-----------------------------
-2 ~32 y
-1 ~48 y
0 ~64 y
1 ~80 y
2 ~96 y
3 ~112 y
4 ~128 n
5 ~160 n
6 ~192 n
7 ~224 n
8 …Run Code Online (Sandbox Code Playgroud) 在对最近问题的评论中,Stéphane Chazelas 提到双括号算术存在安全隐患,例如:
x=$((1-$x))
Run Code Online (Sandbox Code Playgroud)
在大多数贝壳上。
我的谷歌技能似乎生疏了,我找不到任何东西。双括号算术的安全含义是什么?
我有一个上下文,我需要在 shell 脚本中将二进制转换为十六进制和十进制,反之亦然。有人可以建议我一个工具吗?
我有一个设置 -e 的 bash 脚本,因此脚本将在任何退出状态下退出!= 0。
我正在尝试执行一些分配给变量的基本 shell 算术,有时表达式等于 0,这会导致 let 或 expr 命令的退出状态为“1”。
下面是一个例子:
#!/bin/bash -ex
echo "Test 1"
Z=`expr 1 - 1` || true
echo "Z will print"
let "A=4 - 4"
echo "A WILL NEVER PRINT $A"
Y=`expr 1 - 1`
echo "Y WILL NEVER PRINT $Y"
X=$(expr 2 - 2)
echo "X WILL NEVER PRINT $X"
Run Code Online (Sandbox Code Playgroud)
输出是:
$ ./test_error.sh
+ echo 'Test 1'
Test 1
++ expr 1 - 1
+ Z=0
+ true
+ echo …Run Code Online (Sandbox Code Playgroud) 这是一个探索性问题,这意味着我不完全确定这个问题是关于什么的,但我认为它是关于 Bash 中最大的整数。无论如何,我会明示地定义它。
$ echo $((1<<8))
256
Run Code Online (Sandbox Code Playgroud)
我通过移动一点来产生一个整数。我能走多远?
$ echo $((1<<80000))
1
Run Code Online (Sandbox Code Playgroud)
显然没有那么远。(1 是出乎意料的,我会回到它。)但是,
$ echo $((1<<1022))
4611686018427387904
Run Code Online (Sandbox Code Playgroud)
仍然是积极的。然而,不是这个:
$ echo $((1<<1023))
-9223372036854775808
Run Code Online (Sandbox Code Playgroud)
再往前走一步,
$ echo $((1<<1024))
1
Run Code Online (Sandbox Code Playgroud)
为什么是 1?为什么会出现以下情况?
$ echo $((1<<1025))
2
$ echo $((1<<1026))
4
Run Code Online (Sandbox Code Playgroud)
有人想分析这个系列吗?
更新
我的机器:
$ uname -a
Linux tomas-Latitude-E4200 4.4.0-47-generic #68-Ubuntu SMP Wed Oct 26 19:39:52 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来告诉 awk 在替换操作中进行高精度算术。这涉及从文件中读取一个字段,并用该值的 1% 增量替换它。但是,我在那里失去了精度。这是问题的简化再现:
$ echo 0.4970436865354813 | awk '{gsub($1, $1*1.1)}; {print}'
0.546748
Run Code Online (Sandbox Code Playgroud)
在这里,我有一个 16 位的小数精度,但 awk 只给出了 6 位。使用 printf,我得到了相同的结果:
$ echo 0.4970436865354813 | awk '{gsub($1, $1*1.1)}; {printf("%.16G\n", $1)}'
0.546748
Run Code Online (Sandbox Code Playgroud)
关于如何获得所需精度的任何建议?
尝试一下:
$ a=0
$ let a++
$ echo $?
1 # Did the world just go mad?
$ echo $a
1 # Yes, it did.
$ let a++
$ echo $?
0 # We have normality.
$ echo $a
2
Run Code Online (Sandbox Code Playgroud)
对比一下:
$ b=0
$ let b+=1
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)
这(来自Sirex):
$ c=0
$ let ++c
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
$ bash --version
GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
Run Code Online (Sandbox Code Playgroud) $ echo $(( 255 ))
255
$ echo $(( 33 ))
33
$ echo $(( ~33 ))
-34
$ echo $(( ~255 ))
-256
$
Run Code Online (Sandbox Code Playgroud)
我的内核是:
$ uname -a
Linux HOSTNAME 3.2.0-40-generic-pae #64-Ubuntu SMP Mon Mar 25 21:44:41 UTC 2013 i686 i686 i386 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
问题: ~用于否定 AFAIK 数字。但是为什么~33产生-34,为什么~255产生-256?
数据
1
\begin{document}
3
Run Code Online (Sandbox Code Playgroud)
代码
#!/bin/bash
function getStart {
local START="$(awk '/begin\{document\}/{ print NR; exit }' data.tex)"
echo $START
}
START2=$(getStart)
echo $START2
Run Code Online (Sandbox Code Playgroud)
返回2但我想要3. 我在这个关于如何在 bash 脚本中添加数字的答案中最终更改失败:
START2=$((getStart+1))
Run Code Online (Sandbox Code Playgroud)
如何在 Bash 脚本中增加局部变量?
arithmetic ×10
bash ×6
function ×2
shell ×2
shell-script ×2
awk ×1
bashrc ×1
bc ×1
binary ×1
command-line ×1
exit ×1
ksh ×1
scripting ×1
security ×1
variable ×1