我有一个名为file.txt的文件,它具有1到100之间的一些随机数。因此,脚本会读取该文件并执行一堆命令并打印一些语句。
获得结果的一种方法可能是类似的东西,但是在脚本中包含100条if
和elif
语句看起来并不好。
for i in `cat file.txt`; do
echo "Displaying" $i
if [[ $i = 1 ]]; then
echo "blah blah blah for" $i
command1
command2
elif [[ $i = 2 ]]; then
echo "blah blah blah for" $i
command3
command4
command5
elif [[ $i = 3 ]]; then
echo "blah blah blah for" $i
command6
command7
elif [[ $i = 4 ]]; then
echo "blah blah blah for" $i
command8
command9
command10
elif [[ $i = 5 ]]; then
echo "blah blah blah for" $i
command11
command12
command13
command14
elif [[ $i = 6 ]]; then
echo "blah blah blah for" $i
command15
....
....
....
....
....
....
elif [[ $i = 99 ]]; then
echo "blah blah blah for" $i
command310
command311
command312
command313
command314
elif [[ $i = 100 ]]; then
echo "blah blah blah for" $i
command315
fi
done
在bash上是否有更好或更聪明的方法
答案 0 :(得分:2)
case
的经典情况:
case "$i" in
1)
echo "blah blah blah for" $i
command1
command2
;;
[…]
*)
echo "Unhandled value $i" >&2
exit 2
esac
除此之外:
答案 1 :(得分:1)
我的建议是利用case
语句。它是编程中称为switch statement的bash版本。它们通常比if-then-else语句要快,因为它们很可能是通过查找表或哈希列表实现的。
此外,优化的实现可能比替代方法执行得快得多,因为它通常是通过使用索引分支表来实现的。例如,如果正确实现,则基于单个字符的值确定程序流的效率将大大超过替代字符,从而大大减少了指令路径的长度。当这样实现时,switch语句本质上将成为完美的哈希。
来源:Wikipedia
可以在这里找到有趣的比较:Which is faster of two case or if?
要处理您的代码,请使用以下形式的循环
for i in $(cat file); do
...
done
应该被重写。逐字阅读文件时,您应该编写如下内容:
while read -r line; do
for i in $line; do
...
done
done < file
您是if-then-else,然后将其重写为:
case "$i" in
1) command1; command2; command3 ;;
2) command4; command5; command6 ;;
...
100) command315; command316;;
esac