菜鸟教程之学习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