Linux——Shell脚本学习
shell介绍
Shell通常指的是命令行界面的解析器,也用于泛指所有为用户提供操作界面的程序,也就是程序和用户交互的层面。
Shell 执行shell程序,这些程序叫脚本。
创建脚本使用文本编辑器来创建包含指令的文件,这里使用vim
1 | vim bash.sh |
把脚本设置为可执行,
1、
1 | /bin/bash bash.sh |
1 | chmod +x bash.sh ##改变文件权限,使这个文件可以被所有用户执行 |
Shell 语法
变量
所有变量都被看作字符串并以字符串来存储.
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:(变量名称使用小写英文命名,因为系统中的全局变量是大写命名的,为防止重复定义就用小写)
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线 _。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
在shell中,可以通过在变量名前加上$符号来访问它的内容, 一种检查变量内容的简单方式就是变量前加上$再用echo命令将它的内容输出到终端。
1 | salutation=Hello |
read可以给变量复制相当于C语言的input
1 | read salutation |
要想输出空格需要用双引号给引用出来,要想显示双引号可,以用单引号来显示出来,在显示信息中想要有美元符号,必须在前面加上\
变量每次被引用时,都会输出当前赋给它的值。重要的是要记住,引用一个变量值时需要使用美元符,而引用变量来对其进行赋值时则不要使用美元符。
可以通过`反引号来将命令输出赋值给变量或者$()
1 | testing = `date` |
使用 unset 命令可以删除变量。
变量类型
运行shell时,会同时存在三种变量:
- 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
Shell数组
bash支持一维数组,并且没有限制大小。
1 | 数组名=(值1 值2 ... 值n) #例如这样array_name=(value0 value1 value2 value3) |
读取数组
1 | {数组名[下标]} #例如echo ${array_name[@]} |
获取数组长度
1 | 取得数组元素的个数 |
bash shell脚本不支持浮点型运算,只支持整数运算,如果想要计算可用bash的计算器bc
流程控制
if
1 | if condition |
if -else
1 | if condition |
if else-if else
1 | if condition1 |
如果使用 ((…)) 作为判断语句,大于和小于可以直接使用 > 和 <
1 | a=10 |
for循环
1 | for var in item1 item2 ... itemN |
当变量值在列表里,for 循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的 shell 命令和语句。in 列表可以包含替换、字符串和文件名。in列表是可选的,如果不用它,for循环使用命令行的位置参数。
顺序输出当前列表中的数字:
1 | for loop in 1 2 3 4 5 |
while循环
1 | while condition |
until 循环
until 循环执行一系列命令直至条件为 true 时停止。condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环
1 | until condition |
case… esac
case … esac 为多选择语句,与其他语言中的 switch … case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case … esac 语句,esac(就是 case 反过来)作为结束标记。
1 | echo '输入 1 到 4 之间的数字:' |
和C语言一样break用来跳出所有循环,continue是用来跳出当前循环。
test命令
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
参数 | 说明 |
---|---|
-eq | 等于则为真 |
-ne | 不等于则为真 |
-gt | 大于等于则为真 |
-ge | 小于等于则为真 |
-lt | 小于则为真 |
-le | 小于等于则为真 |
eg:
1 | !/bin/bash |
文件测试
参数 | 说明 |
---|---|
-e文件名 | 如果文件存在则为真 |
-f文件名 | 如果文件存在且可读则为真 |
-w文件名 | 如果文件存在且可写则为真 |
-x文件名 | 如果文件存在且可执行则为真 |
-s文件名 | 如果文件存在且至少有一个字符则为真 |
-d文件名 | 如果文件存在且为目录则为真 |
-f文件名 | 如果文件存在且为普通文件则为真 |
-c文件名 | 如果文件存在且为字符型特殊文件则为真 |
-b文件名 | 如果文件存在且为块特殊文件则为真 |
1 | cd /bin |
shell函数
1 | [ function ] funname [()] |
- 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
- 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255
1 | !/bin/bash |
传参
1 | !/bin/bash |
参数处理 | 说明 |
---|---|
$# | 传递到脚本或函数的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |