【linux系统】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后拼接上:a

    mox@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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沙diao网友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值