Shell编程

本文介绍了Shell的基础知识,包括它作为命令行解释器的角色、不同版本以及如何查看版本。详细讲解了Shell的两种执行模式、脚本注释和执行方式。还探讨了变量的定义、环境变量的设置以及如何通过source命令执行脚本。此外,文章还涵盖了算术运算、逻辑运算、关系运算符和循环结构。最后,展示了如何编写和执行简单的Shell脚本。
摘要由CSDN通过智能技术生成

Shell介绍

Shell是一种命令行解释器,是为用户和操作系统之间通信提供的一种接口,接受用户输入的命令,将其转换为一系列的系统调用送到内核执行,并将结果输出给用户。
RedHat和CentOS发行版中默认安装了多种Shell,可以使用cat /etc/shells命令来确认系统中可用的Shell是什么版本;
查看shell的具体版本,比如bash:bash --version
shell两种执行方式:互动模式和脚本模式
在终端可以使用ctrl+c快捷键退出

Shell脚本执行

脚本注释

# 以#开头注释,头部#!开头(指明解释器)除外
# echo "单行注释"

# 多行注释如下<<!开头,中间是要被注释的代码块,!结尾;
<<!
echo "多行注释,这里是要被注释的代码块"
!
<<comment
echo "<<!这个感叹号!也可以是其他任意字符,开头和结尾一致即可,比如comment"
comment

脚本的相对路径或绝对路径
该方法需要赋予脚本+x执行权限:chomd +x HelloWorld.sh,并在脚本头部指明shell解释器版本路径,比如bash; 脚本顶部#!开头用于指明解释器;
cat HelloWorld.sh
#!/bin/bashecho HelloWorld

# 切换到脚本目录下执行
cd /tmp
# 新建shell文件,编辑保存,编辑此处省略
vim HelloWorld.sh
# 执行脚本,.代表当前目录,前面需要带点,不然是从环境变量目录下找,提示找不到
./HelloWorld.sh
# 也可以使用绝对路径
/tmp/HelloWorld.sh
# 也可以把脚本移动到环境变量目录下,直接执行,可能账号没权限,使用sudo执行
sudo mv HelloWorld.sh /bin
HelloWorld.sh

cat HelloWorld.sh

sh 脚本
使用sh 脚本执行,脚本头部无须指明解释器,bash HelloWorld.sh
可以使用-x参数来查看脚本具体运行过程:base-x HelloWorld.sh
该方法不用赋予脚本+x执行权限,用户本身有sh执行权限,通过sh执行脚本;

# 取消执行权限
chmod -x HelloWorld.sh
# 执行脚本
bash HelloWorld.sh

source 脚本
source命令也可读取并在当前环境中执行脚本,同时还可返回脚本中最后一个命令的返回状态;如果没有返回值则返回0,代表执行成功;如果未找到指定的脚本则返回false。source HelloWorld
子进程
可以通pstree命令查看进程数
bash exit.sh会开启子进程执行脚本
source exit.sh不会开启子进程执行脚本

#!/bin/bash
# 关闭命令,使用source命令执行脚本,脚本执行完会关闭终端
exit

Shell变量

变量基本介绍

Linux Shell变量分为:系统变量和用户变量。系统变量:HOME当前账户根目录、PWD当前目录、SHELL使用的shell、USERPATH环境边浪、LOGNAME登录用户名、HOSTNAME主机等,echo $PWD
显示当前所有变量:set
系统预设变量

变量定义

定义变量:变量名=值:VAR=100=前后不能有空格;
撤销变量:unset 变量名:unset VAR
声明静态变量:readonly变量,静态变量不能unset

readonly VAR=100
echo $VAR
#unset B

设置环境变量

基本语法

  1. export 变量名=变量值
    将shell变量输出为环境变量|全局变量,可以在shell脚本里调用
  2. source 配置文件
    让修改后的配置文件立即生效,不然修改配置文件要注销后才能生效;
  3. echo $变量名
    查看环境变量的值
# 新建环境变量目录
mkdir /tmp/new_path
# 变量环境变量配置文件,增加环境变量:export NEW_PATH=/tmp/new_path,并保存(编辑省略)
vim /etc/profile
# 使用source命令使配置文件立即生效
source /etc/profile
# 查看新增的环境变量值
echo $NEW_PATH
# 可以在另一个shell脚本里使用该变量

# 删除测试环境变量目录
rmdir /tmp/new_path
# 编辑配置文件,删除环境便令
vim /etc/profile

环境变量配置

/etc/profile在开机时会运行,可以植入一些命令,在该文件设置环境变量对全用户生效;
./etc/profile ,~/.bashrc, ~/.bash_file的区别?
~/.bashrc, ~/.bash_file是宿主目录下的,里面的环境变量也叫shell变量,是局部的,只对特定的shell有效。
/etc/profile里面的变量是全局的,对所有用户的shell有效。

一行代码多命令执行机制

一行代码中输入多条命令,在Shell中可以使用;(分号)、&&(与)、||(或)这三个符号将多个命令分隔。

  • 分号:按顺序执行命令,分号前后的命令可以没有任何逻辑关系
  • &&:前一条命令执行成功后,才会执行&&后面的命令
  • ||:前一条命令不执行或执行失败后才执行后一条命令

运算符

算数运算

Shell支持多种算术运算,可以使用$((表达式))、$[表达式]、let表达式进行整数的算术运算,注意这些命令无法执行小数运算;使用bc命令可以进行小数运算;
常用运算符号

TMP=$[5+6]

# 乘以10
NUM=$((TMP*10))  

# 逻辑与判断,两个都为真输出1,否则返回0
echo $[5>6&&4<10] 

使用let命令计算时,默认不会输出运算的结果,一般需要将运算的结果赋值给变量,通过变量查看运算结果。另外,使用let命令对变量进行计算时,不需要在变量名前添加$符号。

let NUM=1+2
echo $NUM

let I=(1+9)*10;echo $I

也可以使用expr表达式工具计算,比如(运算符两边要有空格),等于==和不等于!=不适用;

num=`expr 10 + 20`

Bash仅支持对整数的四则运算,不支持对小数的运算,小数运算可以使用bc计算器,支持交互和非交互模式;

  • 交互模式,默认显示整数部分,通过bc的内置变量scale指定保留小数位;
bc
3/9   # 保留整数部分,返回是0
scale=2
3/9   # 返回0.33
quit   # 使用quit命令退出bc计算器
  • 非交互模式
    内置变量ibase(in)和obase(out)可以进行进制转换,ibase用来指定输入数字的进制,obase用来设置输出数字的进制,默认输入和输出的数字都是十进制的
NUM=$(echo "(2+8)*10" | bc)
echo $NUM    # 输出100

echo "10*20;scale=3;3/9" | bc   # 输出200  0.333

echo "obase=8;10" | bc   # 十进制转8进制,输出12
echo "ibase=2;111" | bc   # 111二进制转10进制,输出7

echo "length(123456)" | bc  # 统计数字的长度,输出6

关系运算符

字母代表的单词:
eq -> equal
ne -> not equal
gt -> greater than
lt -> less than
ge -> greater than or equal
le -> less than or equal

运算符说明
-eq等于
-ne不等于
-gt大于
lt小于
-ge大于等于
-le小于等于

编辑脚本shell_0924.sh如下
给脚本加上可执行权限chmod +x shell_0924.sh
执行脚本./shell_0924.sh

#!/bin/bash

a=10
b=20

echo "${a},${b}val"

# if 判断的方括号前后要加空格
if [ $a -ge $b ]
then
    echo "a>b"
else
    echo "a<b"
fi

布尔运算符

运算符解释
!非,取反
-o或or
-a并且,and

字符串运算符

运算符解释
=相等
!=不等,不等返回true
-z字符串长度如果为0返回true
-n字符串长度不为0返回true
str检测字符串是否为空,无为空返回true

循环

for循环

#!/bin/bash

echo "打印系统传入变量"
for each in $@
do
	echo "变量each为:${each}"
done

# 求和
UNTIL=50
SUM=0
for ((i=1;i<=$UNTIL;i++))
do
    SUM=$[$SUM+$i]
done
echo "总和SUM=${SUM}"

while

# 格式
while condition
do 
    command
done

示例:

i=1

while( ($i<10) )
do
    echo $i
    i=$[i+1]
done

判断

如果写在一行,需要用分号隔开;方括号前后要加空格;
if [ condition ];then command1;fi

num=100
if [ $num -eq 100]
then 
    echo "等于100"
elif [ $num -gt 100 ] 
then 
    echo "大于100"
else
    echo "小于100"
fi
 

待更新…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值