菜鸟教程之学习Shell script笔记(上)

时间:2022-01-15 14:38:27

菜鸟教程之学习Shell script笔记

以下内容是,学习菜鸟shell教程整理的笔记

菜鸟教程之shell教程:http://www.runoob.com/linux/linux-shell.html

Shell简介

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Shell脚本(shell script),是一种shell编写的脚本程序。

业界所说的shell通常是指shell脚本,但是shell和shell script是两个不同的概念。shell包括shell script和开发shell本身。一般实际生产操作过程中用的是shell编程,编写特定功能的shell script用来解决实际问题。

Shell环境

Bash:Bourne Again Shell (free and simple to use)

Bash是大多数Linux使用的system默认shell

一般情况下并不区分Bourne Shell 和 Bourne Again Shell,所以像#!/bin/sh 可以改为#!/bin/bash,#! 告诉系统其后路径指定的程序即是解释此脚本文件的shell程序。

Shell命令

  • $ echo "hello world" #输出命令
  • 运行shell脚本的两种方法:

    ./test.sh

    /bin/sh test.sh or /bin/php test.php #直接以解释器运行,就不需要在第一行指定解释器信息。

Shell变量

  • 和C语言的命名规则差不多,需要注意的是,不能使用标点符号,不能使用bash里的关键字(可用help命令查看保留的关键字)
  • 定义使用变量

    your_name="xxx"

    echo $your_name

    echo ${your_name} #变量名后面的花括号用来明确变量的边界
  • 只读变量

    使用readonly命令可以将变量变为只读变量

    readonly xxx
  • 删除变量

    unset xxx #unset 命令不能删除只读变量

Shell字符串

字符串可用用单引号,也可用双引号,亦可以不用引号

  • str='this is a string'

    your_name='runoob'

    双引号里面可以有变量,可以出现转义字符
  • 拼接字符串:
your_name="shell"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello,${your_name} !"
echo $greeting $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
  • 输出结果
hello, shell ! hello, shell !
hello, shell ! hello, ${your_name} !
  • 获取字符串长度
string="abcd"
echo ${#string} #在字符串前面加#就可以实现
  • 提取子字符串

    从第2个字符开始截取4个字符
 string="shell is great"
echo ${string:1:4} #输出 hell
  • 查找子字符串

    用 expr index 实现

    查找字符i或a的位置(哪个字母先出现就计算哪个)
string="shell is great"
echo `expr index "$string" io` # 输出 7 (空格也算字符)

Shell数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

  • 定义数组
数组名={value0 value1 valuue2....} or array_name=(
value0
value1
value2
value3
) #也可以单独定义:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
  • 读取数组
一般格式:${数组名[下标]}
vuluen=${array_name[n]}
使用@符号可以读取数组中所有的元素
echo ${array_name[@]}
  • 获取数组的长度
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
length=${#array_name[n]}
  • Shell注释

    用#号实现单行注释

    用:<<EOF .... EOF 实现多行注释,EOF 可以换成其它字母 如‘ or !

Shell传递参数

#!/bin/bash
echo "Shell 传递参数实例!"
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
eg:./test.sh 1 2 3

只会传递存在的参数个数,如果输入的是./test.sh 1 2 3 4 则4不会被输出

$# $* $@ 的作用及区别
#!/bin/bash
echo "Shell传递参数实例!";
echo "第一个参数为:$1";
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";
echo "-- \$* 演示 --";
for i in "$*"; do
echo $i
done
echo "-- \$@ 演示 --";
for i in "$@"; do
echo $i
done 执行脚本,输出结果如下所示:
Shell 传递的参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3
参数个数是:3
传递的参数作为一个字符串显示:1 2 3
--$* 演示 --
1 2 3
-- $@ 演示 --
1
2
3 $*与$@区别:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)
  • $$ :脚本运行的当前进程ID号
  • $- :显示Shell使用的当前选项,与set命令功能相同
  • $? :显示最后命令退出的状态 0表示没有错误 其他任何值表明有错误
  • Linux set命令用于设置shell set指令能设置所使用shell的执行方式,可依照不同的需求来做设置。语法:set [+-abCdefhHklmnpPtuvx] -a  标示已修改的变量,以供输出至环境变量。

    -b  使被中止的后台程序立刻回报执行状态。

    -C  转向所产生的文件无法覆盖已存在的文件。

    -d  Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用-d参数可取消。

    -e  若指令传回值不等于0,则立即退出shell。

    -f   取消使用通配符。

    -h  自动记录函数的所在位置。

    -H Shell  可利用"!"加<指令编号>的方式来执行history中记录的指令。

    -k  指令所给的参数都会被视为此指令的环境变量。

    -l  记录for循环的变量名称。

    -m  使用监视模式。

    -n  只读取指令,而不实际执行。

    -p  启动优先顺序模式。

    -P  启动-P参数后,执行指令时,会以实际的文件或目录来取代符号连接。

    -t  执行完随后的指令,即退出shell。

    -u  当执行时使用到未定义过的变量,则显示错误信息。

    -v  显示shell所读取的输入值。

    -x  执行指令后,会先显示该指令及所下的参数。

    +<参数>  取消某个set曾启动的参数。
  • 也可以在配置文件里修该Linux shell set

    全局配置文件(都在/etc/目录下,etc为environment config缩写):

    /etc/profile(不推荐修改)——每个用户在登录时都会调用

    /etc/bashrc(推荐在此处设置全局环境变量,只对bash有效)——每个用户在bash打开时都会调用

    /etc/paths(推荐在此处配置全局环境变量)——写法为一行一个路径,其他配置文件中可通过如下形式追加PATH:【export PATH=$PATH:[path1]:[path2]:[path3]……:[pathN] 】

用户配置文件:(都在~/家目录下)

~/.bash_profile(推荐在此处配置用户环境变量,只对bash有效)——当前用户登录时调用

~/.bashrc(推荐在此处配置用户环境变量,只对bash有效)——当前用户bash打开时调用

Shell数组

  • 数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。

    与大部分编程语言类似,数组元素的下标由0开始。

    Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:
array_name=(value1 value2)
  • 使用下标定义数组
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
  • 读取数组
${array_name[index]}
  • 使用@ or *可以获取数组中的所有元素
#!/bin/bash
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "数组的元素为:${my_array[*]}"
echo "数组的元素为:${my_array[@]}"
  • 获取数组的长度
用${#xxx[* or @]}获取数组的长度
eg:
#!/bin/bash
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "数组元素个数为:${#my_array[*]}"
echo "数组元素个数为:${#my_array[@]}" $ ./test.sh
数组元素个数为:4
数组元素个数为:4