在 POSIX shell 中使用while 循环来处理文本通常被认为是不好的做法吗?
正如Stéphane Chazelas 所指出的,不使用 shell 循环的一些原因是概念、可靠性、易读性、性能和安全性。
这个答案解释了可靠性和易读性方面:
while IFS= read -r line <&3; do
printf '%s\n' "$line"
done 3< "$InputFile"
Run Code Online (Sandbox Code Playgroud)
为了性能,从文件或管道读取时,while循环和读取非常慢,因为内置的read shell一次读取一个字符。
怎么样的概念和安全性方面?
我想知道运行脚本的最快方法是什么,我一直在读到在终端上显示脚本的输出与将其重定向到文件或/dev/null.
因此,如果输出不重要,那么让脚本更快地工作的最快方法是什么,即使它是 minim 。
bash ./myscript.sh
-or-
bash ./myscript.sh > myfile.log
-or-
bash ./myscript.sh > /dev/null
Run Code Online (Sandbox Code Playgroud) 1 #!/bin/bash
2 # query2.sh
3
4 numbers=(53 8 12 9 784 69 8 7 1)
5 i=4
6
7 echo ${numbers[@]} # <--- this echoes "53 8 12 9 784 69 8 7 1" to stdout.
8 echo ${numbers[i]} # <--- this echoes "784" to stdout.
9
10 unset numbers[i]
11
12 echo ${numbers[@]} # <--- this echoes "53 8 12 9 69 8 7 1" to stdout.
13 echo ${numbers[i]} # <--- stdout is blank.
Run Code Online (Sandbox Code Playgroud)
Why, in line …
希望这个问题不是太笼统。我对 shell 脚本很陌生,我来自计算机体系结构/非脚本编程背景。我在我工作的脚本中注意到,很少通过围绕整个脚本创建子 shell 来编写脚本。在我正在编写的脚本中,当我可以用一个子 shell 包围它时,我就是这样,因为它可以防止它与调用我的其他脚本混淆(以防万一)。由于与此方法相关的一些开销,这不是一种常见做法吗?我很难在网上找到这个。
例子:
#!/bin/bash
( #Start of subshell
echo "Some stuff here"
) #End of subshell
Run Code Online (Sandbox Code Playgroud) 我有这一行:
trap 'jobs -p | xargs kill -9' SIGINT SIGTERM EXIT
它在我拥有的许多 bash shell 脚本中重复出现。
共享此代码的最佳方式是什么?我可以调用 bash 函数吗?
实际上,我正在创建一个框架,并且用户将需要编写一些粘合 shell 脚本。如果用户的 shell 脚本能够以某种方式从基本 shell 脚本继承,那就太好了。或者他们可以以某种方式调用预先存在的 bash 函数。
问题是,如果我创建一个像这样的 bash 函数:
// a.sh
function trap_and_kill_child_jobs {
trap 'jobs -p | xargs kill -9' SIGINT SIGTERM EXIT
}
Run Code Online (Sandbox Code Playgroud)
并从另一个脚本中调用它,如下所示:
// b.sh
source ./a.sh
trap_and_kill_child_jobs
sh -c 'sleep 10000 &' & # I want this process to be killed by `trap_and_kill_child_jobs`
./run-some-tests.js
Run Code Online (Sandbox Code Playgroud)
调用者脚本 ( b.sh)实际上并没有遇到陷阱。b.sh 创建的“子作业”将继续运行。
我正在构建一个函数,该函数将计算给定安培数、距离(以英尺为单位)和允许电压降所需的电线规格。
给定这些值,我可以计算出“圆形密耳”,从而得到AWG 要求。我开始构建一个大型if elif声明来将圆形密耳与其受人尊敬的仪表进行比较,但我相信这case是正确的工具。
我还没有找到任何用于比较数字的案例示例,所以我想知道是否可以执行以下操作:
what.gauge () {
let cmils=11*2*$1*$2/$3
let amils=17*2*$1*$2/$3
case $cmils in
320-403)
cawg="25 AWG"
;;
404-509)
cawg="24 AWG"
;;
510-641)
cawg="23 AWG"
;;
etc...
}
Run Code Online (Sandbox Code Playgroud) 可以bash为定义大小的数组预先分配内存吗?我declare -a arr在循环 ( arr+=("$str")) 中迭代地将字符串添加到数组(由 声明),并且想知道是否可以通过预分配适当大小的内存(例如,包含不大于 512 个字符的字符串的 10,000 个元素)来提高性能。
我正在尝试将字符串转换为string=11111001数组,我可以通过调用相应的数组索引来访问它
arr[0]=1, arr[1]=0
Run Code Online (Sandbox Code Playgroud)
我是 shell 脚本的新手,从我读到的内容来看,它没有我被卡住的分隔符。
有人能帮我吗?