Shell脚本--菜鸟教程笔记

时间:2021-08-17
本文章向大家介绍Shell脚本--菜鸟教程笔记,主要包括Shell脚本--菜鸟教程笔记使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Shell学习笔记

只针对菜鸟教程学习,后续再随着使用完善补充

shell环境:

Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

Shell常见种类有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash) -- 本文记录的是Bash的学习笔记
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)

在线编辑器:https://www.runoob.com/try/runcode.php?filename=helloworld&type=bash

编写及运行

  1. 第一行代码需要告诉系统这个脚本需要什么解释器来执行
#! /bin/bash
echo "hello world"
  1. 运行,以vscode运行test.sh为例(保证电脑里有git)

shell变量

变量命名

变量名的命名须遵循如下规则:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

变量名和等号之间不能有空格

以下语句可以将文件xx下目录的文件名循环出来

for file in `ls /etc`
或
for file in $(ls /etc)

例如想打印文件dnk下的所有文件名:

for file in `ls ./dnk`;do
    echo ${file}
done

使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

your_name="xiaohan"
echo $your_name
echo ${your_name}

花括号{}加不加都可以,但是不加的时候可能会出现和关键字冲突的情况,推荐写代码时加上花括号。

for skill in xian nv; do
    echo "I am good at ${skill}Script"
done

以上述代码为例,上边展示的是skill没加花括号的结果,解释器就会把$skillScript当成一个变量(其值为空),下方的结果则是我们期待的运行结果。

只读变量

  1. 已定义的变量,可以被重新定义,如:
name="hhh"
echo ${name}
name="www"
echo ${name}

第二次赋值的时候不能写$your_name="alibaba",使用变量的时候才加美元符($)。

  1. 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
my_name="xxn"
readonly my_name
my_name="dsz"

上面的例子尝试更改只读变量,结果报错:
./test.sh: line 15: my_name: readonly variable

删除变量

使用unset可以删除变量,但是只读变量不可以删除

my_name="hhh"
unset my_name

Shell字符串

定义字符串

字符串可以用单引号,也可以用双引号,也可以不用引号。当字符串有空格时,必须用引号

  1. 单引号
    str='this is a string'

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
  1. 双引号
  • 双引号里可以有变量
  • 双引号里可以出现转义字符
  • 双引号里可以直接打印出单引号,如果想打印双引号需要用转义符\
my_name="xxn"
str1="hello, I know you are \"${my_name}\""
str2="hello, I know you are '${my_name}'"
str3="hello, I know you are ${my_name}"
str4="hello, I know you are "${my_name}""
echo "str1:${str1}"
echo "str2:${str2}"
echo "str3:${str3}"
echo "str4:${str4}"

代码运行结果为

str1:hello, I know you are "xxn"
str2:hello, I know you are 'xxn'
str3:hello, I know you are xxn
str4:hello, I know you are xxn

拼接字符串

  1. 使用单引号拼接
str='不错'
pinjie1='今天天气'${str}''
pinjie2='今天天气${str}'
pinjie3='今天天气"${str}"'
'''
结果为

今天天气不错
今天天气${str}
今天天气"${str}"

2. 使用双引号拼接
```shell
pinjie4="今天天气'${str}'"
pinjie5="今天天气${str}"
pinjie6="今天天气"${str}""

结果为

今天天气'不错' 
今天天气不错 
今天天气不错

在单引号内进行拼接,只可以使用成对的单引号括住定义的变量并完成拼接;直接引用和使用双引号括住均无效,只会原样输出
在双引号内进行拼接,可以使用双引号括住变量,也可以直接使用变量;如果使用单引号括住,则单引号会被打印出来

获取字符长度

花括号内,在字符串变量名前加#即可

stt="ddwmkld12"
a=${#stt}

在使用变量的时候要加{}

提取子字符串

${字符串变量名:起始位置:截取长度}

stt="ddwmkld12"
a=${stt:2:4}
echo $a

结果
wmkl

起始位置从0开始

查找字符串

#!/bin/bash
string="runoob is a great site"
# 在string字符串中找r或者o,哪个先出现就输出谁的位置
echo `expr index "$string" ro`

结果是位置偏移,从1开始,例如r的位置是1;找不到的话才输出0

expr index STRING CHARS 命令并不是查找 CHARS 子字符串在 STRING 字符串中的位置。
它只能查找单个字符在 STRING 字符串中的位置。只是 CHARS 可以指定要查找哪几个字符,并以第一个查找到的字符为准。

当 STRING 字符串的内容包含空格时,要用双引号括起来,否则会报错。

其他

字符串还有很多操作,如替换、删除等,用到再看

Shell数组

bash只支持一维数组,初始化时不需要定义数组大小

定义数组

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

array_name=(value0 value1 value2 value3)

还可以单独定义数组的各个分量,可以不使用连续的下标,而且下标的范围没有限制。

arr[0]=50
arr[3]=30

此时输出数组的结果是 “50 30”,但是输出arr[1]的话显示空白,arr[3]才是50

读取数组

${数组名[下标]}
使用 @ 或者 * 符号可以获取数组中的所有元素

#! /bin/bash

arr=(1 2 3 4 'sds' df)
echo ${arr[@]}

输出的结果为

 1 2 3 4 sds df

获取数组的长度

和字符串的方法相同

#! /bin/bash

arr=(1 2 3 4 'sds' df)
# 获取整个数组的长度,即数组中有几个元素。以下两种都可以,结果是6
echo ${#arr[*]}
echo ${#arr[@]}
# 获取数组中单个元素(第5个-sds)的长度,结果为3
echo ${#arr[4]}

Shell注释

  1. 单行注释:以#开头
  2. 多行注释:
:<<xxx
注释内容...
注释内容...
xxx

xxx可以用任意符号代替

Shell传递参数

我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。
$0代表执行的文件名称

#!/bin/bash

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第五个参数为:$5";

传入参数时,终端进行如下操作(上述代码保存在dw.sh)

./dw.sh 1 2 3 4

结果为:

Shell 传递参数实例!
执行的文件名:./dw.sh
第一个参数为:1
第5个参数为:

因为只传入了4个参数,故$5是空白
总结常用几个参数

参数处理 说明
$0 执行的文件名
$n 第n个传入的参数
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。
$@ 与$*相同,但是使用时返回的是每个参数。

$ 与 $@ 区别:*

  • 相同点:都是引用所有参数。
  • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
#!/bin/bash

echo "$*"
# 1 2 3 4
echo "$@"
# 1 2 3 4

for i in "$*";do
    echo '$*' $i 
done
# $* 1 2 3 4   --   相当于传递了“1 2 3 4”这一个参数

for j in "$@";do
    echo '$@' $j
done
# $@ 1
# $@ 2
# $@ 3
# $@ 4   ---  相当于传递了"1" "2" "3" "4" 四个参数

Shell运算符

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

算数运算符

加、减、乘、除、取余、赋值、相等、不等 和其他语言一样

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。语法如下

`expr $a + $b`
# 外边的不是常用的单引号,是~下边那个
#!/bin/bash

a=100;
b=20;
c=`expr $a + $b`
echo $c

乘法的不能直接使用,要用转义符 /

在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 "*" 不需要转义符号 "" 。

关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

运算符 说明
-eq 两个数是否相等
-ne 两个数是否不相等
-gt 左边是否大于右边
-eq 两个数是否相等
-eq 两个数是否相等

原文地址:https://www.cnblogs.com/zhangtao-0001/p/15153809.html