1 shell简介
参考来源https://www.runoob.com/linux/linux-shell.html
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。
由于习惯的原因,简洁起见,本文出现的 “shell编程” 都是指 shell 脚本编程,不是指开发 shell 自身。
Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh)……
在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。
告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。
2 shell入门
(1)输出函数
echo "hello"
printf "world"
(2)变量赋值和调用
class=1 #不允许中间有空格
echo ${class} #加上{}是好习惯
declare -a arr #定义数组
echo ${arr[i]} #调用数组
let "j+=1" #累加方式一
j=$(($j+1)) #累加方式二
(3)判断
num=$(cat ./a.log)
if ((${#nums}>3)) #${#nums}调用nums的长度, 双括号(())
then
echo "hello"
fi
(4)循环
for i in `seq 0 5` # while也可以
do
echo $i
done
(5)正则匹配
C_name=$(echo $file|grep -Po '[A-Z][1-2]?_[A-Za-z]+')
(6)读取时间
current_time=$(date "+%Y.%m.%d %H:%M:%S")
(7)输出文档
echo "hello" > out.txt # 覆盖
echo "hello" >> out.txt # 续写
(8)读取
cat ./a.log
3 shell并行计算控制
在linux中,常用做法是引入了任务队列的概念,类似socket举例中的消费者生产者模型,通过消息队列来调节供需的不平衡,参考https://blog.csdn.net/qq_34409701/article/details/52488964
而在windows subsystem for linux中,管道与命名管道(FIFO文件)无法使用,因为windows系统不支持管道与命名管道(FIFO文件)。找了很久也没看到其他可用的方法,因此,这里介绍一个自己想的笨方法,借助的是文件输出和读取。
#!/bin/bash
num=3 # 并行数上限
echo 0 > a.log
for i in `seq 1 12`
do
{
while (1)
do
sleep ${i}s # 任务开始时通过sleep让任务按次序进行尝试,同时也使得执行任务尝试降低频次
cur=$(cat ./a.log) # 记录当前的并行任务数
if (($cur<3)) # 如果任务数未超过最大限制则可执行,反之则需等待
then
cur=$(($cur+1))
echo $cur > a.log
./out.sh
cur=$(cat ./a.log) # 完成任务之后,将记录的并行任务数减1
cur=$(($cur-1))
echo $cur > a.log
echo "current: "$i", nums of processing:" $cur", completed: "$com"/"12
break # 完成任务之后,跳出循环,未完成则继续尝试
fi
done
}& # &用于并行控制
done
wait # 保证所有任务都能完成