SHELL编程
1.认识shell
- console:大型设备的工作台
- terminal:一个向电脑输入数据的电子设备、一个显示接受到数据的交互系统
- shell:人机接口,是指“提供使用者使用界面的软件”,是一种命令解释器,GUI也是一种shell
1.1terminal、shell和bash三者的关系
terminal里面关联一个shell,shell一共有三种表现形式:
- bash
- zsh
- sh
ubuntu默认情况下是bash,macos最新为zsh
1.2全局设置与个人设置
linux是多用户多任务的系统,用户之间是隔离的,用户间的用户程序也是隔离的
- 全局设置放在系统的根目录
- 个人设置放在自己用户的家目录
大多数软件是放在系统根目录,有两个配置文件,一个全局配置文件,一个个人的配置信息,这样比较方便
1.3关于bash的配置文件
1.全局配置
linux系统全局的配置文件在/etc
- /etc/bash.bashrc:登陆时的shell就是bash
- /etc/bash.profile:用户登陆时会执行
- /etc/bash.bash.logout:用户退出时会执行
2.个人配置
个人配置文件在用户家目录下
- ~/.bashrc
- ~/.bash_profile
- ~/.bash_logout
- ~/.input:用户输入时会执行
2.shell脚本编程
2.1变量、运算符等
#!/bin/bash
#用的是bash解释器
echo "Hello HaiZei" #这是注释
#执行脚本文件的两种方法
bash a.sh#用bash执行a.sh
chmod a.sh
a.sh#将a.sh加上可执行权限
shell是弱类型语言,没有强制规定变量类型
-
``命令替换符:将后面命令的输出赋值给变量
-
$ 变量引用:要用到变量的值要在变量前加上,可以用{}来限制范围,如
${FileName}
-
a=$a:a
:在a后拼接上:amox@mox-ubuntu:~$ a=`pwd` mox@mox-ubuntu:~$ echo $a /home/mox #我们可以看到a为/home/mox #打印a时需在a前家$ mox@mox-ubuntu:~$ a=$a:a mox@mox-ubuntu:~$ echo $a /home/mox:a #可以看到a后面加上了:a
eg:脚本0.sh
#!/bin/bash
echo $#
echo $1
echo $2
#可以求变量长度
2.2输入输出
#read var 输入
mox@mox-ubuntu:~$ read a
asdfsdafsadf
#echo和printf用于输出
mox@mox-ubuntu:~$ echo $a
asdfsdafsadf
mox@mox-ubuntu:~$ printf "hello world\n"
hello world
2.3语法
1.函数
#函数定义的3种方法
function print1 {
echo $1
return
}
print2() {
echo $1
return
}
function print3() {
echo $1
return
}
#函数调用
print1 "function 1"
print2 "function 2"
print2 "function 3"
2.流程控制-IF
if [[ contion ]];then
#statements
fi
#########################
if [[ contion ]];then
#statements
else
#statements
fi
########################
if [[ contion ]];then
#statements
elif [[ contion ]];then
#statements
else
#statements
fi
[[ contion ]]
是test表达式,用来测试条件是否成立,man test查看
INTEGER1 -eq INTEGER2
INTEGER1 is equal to INTEGER2
INTEGER1 -ge INTEGER2
INTEGER1 is greater than or equal to INTEGER2
INTEGER1 -gt INTEGER2
INTEGER1 is greater than INTEGER2
INTEGER1 -le INTEGER2
INTEGER1 is less than or equal to INTEGER2
INTEGER1 -lt INTEGER2
INTEGER1 is less than INTEGER2
INTEGER1 -ne INTEGER2
INTEGER1 is not equal to INTEGER2
eg:
if [[ $1 -eq $2 ]];then
echo "$1 = $2"
elif [[ $1 -lt $2 ]];then
echo "$1 < $2"
else
echo "$1 > $2"
fi
3.流程控制-FOR
for i in var;do
#statements
done
###########################
for (( i = 0; i < 10; i++ ));do
#statements
done
eg:创建10个test.cpp文件
4.流程控制-UNTIL
until跟c语言的while作用相同
until [[ condition ]];do
#statements
done
5.流程控制-CASE
case跟c语言的switch作用相同
case word in
pattern )
#statements
esac
6.数组
#数组声明
declare -a arr
#数组使用
arr[i]=val
arr=(val1 val2 val3)
7.四则运算
#四则运算时需要加$[]或者$(())
a=100
b=5
c=$[$a/$b]###
d=$(($a+$b))###
echo $c $d
2.4用shell编程实现线性筛:1-1000以内所有素数和
线性筛相关知识博客参考线性筛和素数筛
#!/bin/bash
#shell编程可以不用初始化
declare -a prime
End=1000
Sum=0
#初始化数组
function init(){
S=$1
E=$2
for (( i = $S; i <= $E; i++));do
prime[$i]=0
done
}
init 0 1000
for (( i = 2; i <= ${End}; i++ ));do
if [[ ${prime[$i]} -eq 0 ]];then
#if [[ ${prime[$i]}x == x ]];then#用字符串的方法判断是否为空 用这句不能加数组的初始化
prime[0]=$[${prime[0]}+1]
prime[${prime[0]}]=$i
Sum=$[${Sum}+$i]
fi
for (( j = 1; j <= ${prime[0]}; j++ ));do
if [[ $[$i*${prime[$j]}] -gt ${End} ]];then
break
fi
prime[$[$i*${prime[$j]}]]=1
if [[ $[$i%${prime[$j]}] -eq 0 ]];then
break
fi
done
done
echo $Sum
2.5用shell编成实现随机点名
#!/bin/bashi
#source 2.suijishu.sh是将脚本在当前的shell进程运行一次,在终端中运行rand即可运行rand函数
if [[ $# -ne 1 ]];then
echo "Usage: bash 2.suijishu.sh num"
exit
fi
Cnt=$1
Names=(`cat names`)#names为同路径下的文件 将所有人员姓名按行放在names文件中
function rand(){
Min=1
Max=${#Names[*]}
Num=`cat /dev/urandom | head -n 10 | cksum | cut -d ' ' -f 1`#获取随机数
#Num=`date +%s`
echo $[$Num%$Max]
}
for i in `seq 1 $Cnt`;do
RandNum=`rand`
echo "${Names[${RandNum}]}"
done