shell脚本操作

Shell文件语言

终端打印输出用echo指令

echo "hello world"

变量

1 . 变量名必须是字母(a-z,A-Z) + 下划线_

2 . 变量名中不能有标点符号

3 . 变量名中不能有空格

变量输出需要加$符号,但是=是不能加空格的

name="smile2017"
#错误的形式 加了空格
name = "smile2017" 

只读变量

关键字 readonly

name="leon"

#只读name属性
readonly name

#会报错,不会打印
name="sisi"

echo $name

#打印
./hello.sh: line 19: name: readonly variable

删除变量

关键字 unset

name="Andy"

#打印name
echo $name

#删除name
unset name

echo $name

变量类型

类型一:本地变量,作用域整个bash进程可以使用,语法:name="leon"
类型二:局部变量,作用域是当前代码块,用关键字local去修饰,语法:local name= "Andy"
类型三:环境变量,作用域当前shell进程以及子进程,语法:export name="Andy"
类型四:位置变量,${0},${1}等来填入输入不同变量。语法:name=${0},age=${1},echo "姓名${nane},年龄${age}"
例如:

#!/bin/bash
name=${1}
age=${2}
sex=${3}
echo"姓名:${name},年龄:${age},性别:${sex}"

最后执行脚本 执行脚本时写入变量
./hello.sh Jeff 150 男

#文件名称为${0},所以第一个参数从${1}开始

特殊变量

类型
$(0)->特殊变量->文件名称
$(?)->表示返回上一个命令执行状态返回值->0:表示执行成功,1:程序执行结果,2表示程序状态码返回(0-255)
$(#)->参数个数
$(*)->参数列表
$(@)->参数列表
$($)->参数当前shell的PID
$(!)->执行上一个指令的PID

$(*)$(@)的区别在于$(*)会将所有的参数组合成字符串输出,而$(@)会将参数一个一个输出。

字符串

字符串表示:
单引号或者双引号表示

字符串的拼接:
1. 直接用 ${name}${age}${sex}
2. 在变量中用引号info="姓名:"${name}" 年龄:${age}"

获取字符串长度:
在变量名前面直接加上#
eg:name=andy echo=${#name}

字符串截取
例如:

 name="leon is good boy"
 
 #从下标为2的字符串开始开始截取3位
 result=${name:2:3}
 
 #从字符串第5位开始截取,到最后一位
 #方式一:
 length=${#name}-1
 result1=${name:2:lenght}
 
 #方式二:默认后面直接到最后一个
 result2=${name:2}

字符串删除
${变量名#删除的字符串 正则表达式}

#匹配不到
name="i have a dream"
result=${name#dream}
echo ${result}

#默认从左到右匹配查询删除,不然就匹配不到
result1=${name#I}
echo ${result1}

#查找指定字符的第一个,并且删除前面所有的字符,并且包含自己
result2=${name#*D}
echo ${result2}

#指定删除范围
result3=${name#I*D}
echo ${result3}

#如果从右边开始检查就用##
reslut4=${name##*a}
echo ${reslut4}

#从字符串结尾开始匹配用%
result5=${name%m}
echo ${reslut5}

#查找指定字符的第一个,删除所有字符(包含自己)
result6=${name%h*}
echo ${result6}

#删除指定范围
result7=${name%a*m}
echo ${result7}

##方向从左往右
result8=${name%%a*m}
echo ${result8}

Shell语言的echo命令

我们都知道echo是打印输出的意思,那么echo可以怎么实现输入呢

  1. 显示普通的字符串,例如:echo "iPhoneX 标配8888"
  2. 显示转义字符,例如:echo "iPhone 顶配 10000"
  3. 显示变量,例如:iphone="iphoneX" echo "${iphone} 9888"
  4. 显示换行,必须要用-e来开启转义功能,例如:echo -e "iphoneX hello 未来"
  5. 不换行,不换行用c表示,例如:echo -e iPhoneX hello未来 c echo"科技"
  6. 显示一个执行命令,例如要求输入当前时间,用date
  7. 退出命令,exit 状态(详见下方的状态表),如果一旦执行了exit之后,后面的语句就不会继续执行了。
  8. 重定向

关于状态码:

状态码 描述
0 命令执行成功
1 一般性未知错误
2 不适合的shell命令
126 命令不可执行
127 没有找到命令
130 通过ctrl+c终止的命令
255 正常范围内推出的状态码

Shell语言的数组

语法

数组名=(值1 值2 值3...)

初始化

方式一:

name=("404" "andy" "hello" "world")

Shell

方式二:

name=()
name[1]="404"
name[2]="andy"
name[3]="hello"
name[4]="world"

Shell

读取数组

@或者*来输出所有的数组元素,但是@是将元素一个一个输出,*是将数组内元素组合成一个字符串输出。这点需要注意。

echo ${name[*]}
echo ${name[@]}

数组长度

之前说了在输出前面加#是输出字符串长度,这里同样适用于数组,在获取所有元素之后之后在数组前面加上#,如果是*的话,#同样适用,可以很智能的识别空格来进行对元素长度的识别解析。

echo ${#name[@]}
echo ${#name[*]}

如果需要获取单个元素字符长度我们则可以用具体的下标

echo ${#name[3]}

Shell语言的传递参数

语法定义:(终端输入)

./文件名称.sh 参数一 参数二 参数三

获取参数:

之前字符串章节说过用${1},${2}...表示,需要注意的是${0}表示文件名称

echo ${1} ${2} ${3}

Shell

复制

特殊字符

获取脚本输入参数个数

echo ${#}

Shell

复制

获取参数列表

echo ${*}

Shell语言的基本运算符

基本运算符

基本运算符就是我们所称的+ - * / %

a=1234
b=3214
c=`expr $a + $b`

Shell

可以注意到,在shell语言中,单纯的元素相加不能直接用+,而是必须要用expr去计算两个变量的值。而且如果调用,后面的变量名称和+之间必须要加上空格来保证变量的独立性。否则则会当成字符串输出。

注意:当且仅当用乘法的时候必须加上一个转义字符

a=1234
b=3214
c=`expr $a * $b`

Shell

赋值运算符

=
这个符号就很简单了,就不在做阐述了

关系运算符

一张表格阐述

布尔运算符

一张表格阐述

逻辑运算符

一张表格阐述

字符串运算

一张表格阐述

文件测试运算符

一张表格阐述

循环控制语句

if-else

语法结构

if [条件]
    then
        代码
else if [条件]
    then
        代码
else
        代码
fi

Shell

记住判断最后要以fi结尾

例如我们来判定一个学生是不是男生:

sex="man"

if [ $sex = "man" ]
then
    echo "男生"
else
    echo "女生"
fi

for

语法结构

for 变量名 in item1 item2 item3 …
    do
        代码
    done

比如我们要循环打印一个数组中的元素:

names=("张三" "李四" "王五")
for i in ${names[@]}
do
    echo ${i}
done

while

语法结构

while(条件)
    do
        代码
    done

Shell

假设我们要一直循环直到while条件不成立

a=1
while(($a<10))
do
    echo ${a}
    a=`expr $a + 1`
done

case

case

语法结构

case 值 in
    模式1)
        代码
        ;;
    模式2)
        代码
        ;;
    模式3)
        代码
        ;;
    sac

判断number的值

number=1
case $number in
1) echo "等于1"
    ;;
2) echo "等于2"
    ;;
3) echo "等于3"
    ;;
esac
原文地址:https://www.cnblogs.com/cjh1996/p/12881404.html