shell 编程day04

本文详细介绍了Shell编程的基础,包括创建shell文件、添加可执行权限、基础语法如注释、输出和输入、变量声明、使用、只读变量、删除、获取Linux指令结果、字符串操作、数组、运算符以及if语句的使用示例。
摘要由CSDN通过智能技术生成

1.创建shell文件

原则上shell程序可以写在任何文件中,但是一般会在shell文件后加后缀.sh表示当前文件是一个shell文件

shell需要可执行权限,所以创建好的shell文件需要添加x权限

2.基础语法

1.注释

```shell
# 单行注释
:<<EOF
多行注释1
多行注释2
多行注释3
EOF
```

2.输出和输入

输出

echo指令就相当于python中的print函数(默认会换行)

```shell
echo  输出内容  
echo -n 输出内容     # 输出的时候不换行
```

echo -n 的用法:

echo -n 'this is a line without new line'
echo 'it is the result'    

这样的结果 this is a line without new line it is the result。 不换行

输入指令

read 变量名    -- 输入内容,并且将输入的结果保存在变量中

用法: 1. read name      保存退出 wq

             2.这时候在主界面输入 name。

类似于 input()

一般和echo 合起来用 (用于提示)

1.先vim  文件名.sh

2. 进入后,在文件中输入   echo -n 请输入你的名字:  

3.                                         read name

3.变量

a. 声明变量的语法:   变量名=值

说明:  a. 变量名和=, =和值之间不能有空格

​           b. 变量名 由数字、下划线、字母组成 ,不能使用数字开头 也不能使用关键字。

```shell
name='小明'
age=18
stu_name=小红
```


b. 使用变量: 

​        echo $变量

​        echo ${变量}

```shell
age=18
echo $age
age2=${age}
```

举例:

name='xiaoming'
echo $name
echo ${name}
age='18'
echo $name ${age}    可以同时输出两个

num=12345
num1=${num}
echo $num1       这里是将num的值传给num1


c. 只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

```shell
gender='男'
readonly gender    
gender='女'     # test.sh: line 17: gender: readonly variable
```

d. 删除变量

使用 unset 命令可以删除变量

```shell
name='yuting'
unset name
```
 

4 获取linux指令结果

在shell脚本中可以直接写linux指令,在执行shell脚本的时候这些指令可以直接获取

```shell
ls     # ls指令
ls  -lh      # ls指令,并且设置参数
touch a.txt    # 创建a.txt文件
python3 py文件路径

# 获取指令结果: 变量=$(指令)  /   变量=`指令`
lsresult=$(ls)    #将ls指令的结果保存到变量lsresult中.  r1=$(ls)
currnet_path=`pwd`

1.r1=$(ls)

2.变量名=`指令`     r2 = `python3 /root/code/phello.py` , echo $r2

实际例子: 

 r1=$(ls -lh|head -2)
 r2=`python3 /root/code/phello.py`
 echo -n $r1
 echo $r2  

注意:指令是用(), 但是echo ${} 是用大括号

5.shell字符串

1.shell中的字符串可以用单引号也可以使用双引号甚至可以不用引号。但是单引号中不能出现单引号字符,加\也不行

```shell
str1='abc'
str2="abc"
str3=abc
str4='abc\n123'        #支持转义字符,但是不支持编码字符
str5="abc\n123"

age=18
str6="年龄是$age"    #双引号里面可以出现变量,单引号不行
```
 

2.字符串拼接

```shell
str1="hello"

#单引号拼接
str2=''${str1}',world!'
str3=''$str1',world!'

#双引号拼接
str4="${str1},world!"    # (记住!!)
str5=""$str1",world!"

```

拼接实际例子: 

想获取这样一段话: xxx今年xx岁

#字符串拼接 变量="${}今年${}岁"
 name=xiaoxin
 age=16
 result="${name}今年${age}岁"
 echo $result

3.获取字符串长度    echo ${#字符串变量}

```shell
str1="ab.cd"
echo ${#str1}    # 输出4
```
str1='hello world'

echo ${#str1}

4.字符串提取。   echo ${变量名:第几个开始:取几位数}

```shell
# 字符串:下标:个数   --从字符串中指定下标开始获取指定个数字符,返回一个新的字符串
# 字符串:下标:1   -- 获取字符串中指定下标对应的字符
# 字符串:下标     -- 从指定下标开始获取到字符串最后

string='hello world'
echo ${string:1:4}    # ello
```

echo ${字符串变量:索引值:个数}

str='hello'

echo ${str:0:3}  从str中,第0个也就是h开始 一共取三个。
 


6.shell数组 (可用于同时保存多个数据)

1.在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:

```shell
# 数组名=(元素1 元素2 元素3 ...)
names=(小明 小红 大黄 Tom)
names2=(
'小明'
'小红'
'大黄'
'Tom'
)
names3[0]=小明
names3[1]=小红
names3[2]=大黄
names3[3]=Tom

```

举例

array=(英雄联盟 csgo 红色警戒 我被美女包围啦 炉石传说).  : 创建一个数组
echo ${array[1]} $disige       :获取数组第二个元素
echo ${array[*]}                     :获取数组所有元素
 

2.获取数组的长度

```shell
nums=(100 200 300 400)
# 获取数组长度
length=${#nums[@]}
length=${#nums[*]}
# 获取数组指定下标对应的元素的长度
length2=${#num[n]}
```

举例

array=(英雄联盟 csgo 红色警戒 我被美女包围啦 炉石传说)

echo ${#array[*]}                    :获取数组的长度

7.运算符

shell中支持的运算符有:  算术运算符、关系运算符、布尔运算符、字符串运算符

1.算术运算符:+,-,\*,/,%

当运算对象和和运算结果都是整数:

加法: echo `expr 10 + 20`
乘法: echo `expr 10 \* 20`
 减法:echo `expr 10 - 20`
 除法:echo `expr 10 / 20`                                                                                                               
 整除:echo `expr 10 % 20`

当运算对象和和运算结果存在小数时:

echo `echo "scale=4;13.4 / 2.5"|bc`   计算13.4/2.5 并把计算结果保留4位小数。

老师的板书

```shell
# 如果想要在shell完成数值运算,运算的语法:  `expr 运算表达式`; 并且运算符两边必须加空格
re1=10+20
echo ${re1}    # 10+20

1.加法运算
re2=`expr 10 + 20`    
echo ${re2}    # 30

2.减法运算
re3=`expr 10 - 20`
echo ${re3}       # -10

3.乘法运算
re4=`expr 10 \* 20`   # 注意:使用*作为乘法运算符的时候需要前面加\
echo ${re4}     # 200

4.除法运算
# 小数除法运算: `echo "scale=小数点位数;数值1 / 数值2"|bc`
# 整数除法运算: `expr 数值1 / 数值2`
re5=`echo "scale=2;7 / 3"|bc`
echo $re5

re6=`expr 5 / 2`
echo $re6

5.求余数
re7=`expr 10 % 3`

re8=`echo "10.2 + 5.1"|bc`
echo $re8
```
 

2. 关系运算符(比较运算符),比较的是数字大小

注意:关系运算符对应的运算表达式只能作为条件语句放在if 或者while 后面

```shell
# -eq  ---  等于,相当于 ==    equal
# -ne  ---  不等于,相当于!=    none equal
# -gt  ---  大于     greater than
# -lt  ---  小于   less than
# -ge  ---  大于等于 
# -le  ---  小于等于
# 使用语法: [ 值1 关系运算符 值2 ]

a=100
b=10

# 关系运算符要配合if语句或者循环语句使用
if [ $a -gt $b ]
then
    echo a大于b
else 
    echo a不大于b
fi
```

3.布尔运算符(逻辑运算符)

```shell
# !    --  逻辑非运算
# -o   --  逻辑或运算
# -a   --  逻辑与运算

判断是否为闰年:

echo -n 请输入一个年份判断是否为闰年
 
read year
 
 if [ `expr $year % 4` -eq 0 -a `expr $year % 100` -ne 0 -o `expr $year % 400` -eq 0 ]
 then 

     echo $year是闰年
 else
    echo $year不是闰年
 fi

4.字符串运算符

```shell
# [ 字符串1 = 字符串2 ]    -- 判断两个字符串是否相等
# [ 字符串1 != 字符串2 ]   -- 不相等
# [ -z 字符串]   -- 判断字符串长度是否为0
# [ -n "字符串" ]    -- 判断字符串长度是否不为0
# [ $ 字符串 ]   -- 判断字符串是否是空串

a="abc"
b="123"

if [ $a = $b ]
then
    echo a和b相等
else
    echo a和b不相等
fi

a=""
if [ -n "${a}" ]
then
    echo a的长度不为0
else
    echo a的长度为0
fi

```

5. if语句

```shell
语法1:
if 条件语句
then
    满足条件执行的代码
fi

语法2:
if 条件语句
then
    满足条件执行的代码
else
    不满足条件执行的代码
fi


语法3:
if 条件语句1
then 
    代码块1
elif 条件语句2
then
    代码块2
elif 条件语句3
then 
    代码块3
else
    代码块N
fi
```

例子:根据age的值打印 儿童(<=6)\少年(<=12)\青年(<=28)\壮年(<=48)\中年(<=60)\老年(>60)

 echo -n 请输入年龄
 read age
   
 if [ $age -le 6  ]
 then
     echo 儿童
 elif [ $age -gt 6 -a $age -le 12 ]
 then
    echo 少年 
 elif [ $age -gt 12 -a $age -le 28 ] 
 then
     echo 青年

  elif [ $age -gt 28 -a $age -le 48 ]
  then    
     echo 壮年
     
  elif [ $age -gt 48 -a $age -le 60 ]
  then
      echo 中年
  else 
     echo 老年
  fi                                                                                                                                
             
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值