Shell学习
第一节 基本语法
变量 表达式 判断语句 If表达式
一、先来看一个简单的shell程序:
mkdir test
cd test/
vim example01.sh
example.sh
#!/bin/bash
等于#!/bin/sh
(#!跟shell命令的完全路径。 作用: 显示后期命令以哪种shell来执行这些命令, 可用which bash查看绝对路径, 如果不指定shell,以当前shell作为执行的shell)
如果想以其他shell执行, 需写到绝对路径上 cat /etc/shells
例如: 想写php脚本可用: #!/bin/php后期会以php来执行下面的命令
echo "our first example"
执行命令
chord +x example.sh
./example.sh
shell中以#开头表示,整行被当作一个注释,执行时被忽略。
shell程序一般以.sh结尾
总结: 创建shell程序步骤:
第一步: 创建一个包含命令和控制结构的shell文件
第二步:修改这个文件的权限使它可以执行
使用 chmod u+x
第三步: 执行
方法1. ./example.sh
方法2: 使用绝对路径
方法3: 使用 bash example.sh
二、shell变量
变量是shell传递数据的一种方法。变量是用来代表每个值的符号名。
例: x = 3 (x就是变量)
Shell有两类变量: 临时变量和永久变量
临时变量: 是shell程序内部定义的,其使用范围仅限于定义它的程序,对其它程序不可见。包括用户自定义变量、位置变量、预定义变量。
永久变量: 是环境变量,其值不随shell脚本的执行结束而消失。
例:环境变量: echo $PATH
用作运行某个命令的时候,本地查找不到某个命令或文件,会到这个声明的目录中去查找。(which ls去查找)
用户定义变量: 由字母或下划线开头。由字母、数字或下划线组成,并且大小写字母意义不同。变量名长度无限制。
使用变量值时,要在变量名前加上前缀”$”
例:1VAR是非法变量
变量赋值: 赋值号”=” 两边应该没有空格
例: A=aaa (A = aaa会提示command not found)
将一个命令的执行结果赋给变量:
“`
A=date
echo $A
“`
“`
B=$(ls -l) === ls l
echo $B
A=$B
Echo $A
“`
可拼接成新的变量
“`
B=mon
echo Today is $mon day
echo Today is ${mon}day
“`
列出所有的变量: set命令
set | grep DAY
单引号和双引号区别
单引号之间的内容原封不动的指定给变量。
双引号取消了空格的作用,特殊符号的含义保留。
删除变量 unset
unset NAME
位置变量和特殊变量
位置变量 : shell执行解释执行用户的命令时,将命令行的第一个字作为命令名,而其它字作为参数。由出现在命令行上的位置确定的参数称为位置参数。
位置变量: 使用$N 来表示
$0 $n这个程序的第n个参数值 n=1…n
特殊变量: 不能被修改。一执行程序时就有了,由以下特殊变量
- $* 这个程序的所有参数
- $# 这个程序的参数个数
- $$ 这个程序的PID
- $! 执行上一个后台程序的PID
- $? 执行上一个指令的返回值
Read: 作用:从键盘中读入数据,赋值给变量
expr: 作用shell变量的算数运算(整数型变量进行算术运算)
语法: expr.表达式 (运算符之间要有空格)
var1 = 8
var2 = 7
expr $val / 2(结果是4)
$var1 + $var2`
变量测试语句: test 测试条件(测试范围: 整数,字符串,文件)
test str1 == str2 是否相等
test str1 != str2 是否不相等
test str 测试字符串是否不空
test -n str 测试字符串是否为空
test -z str 测试字符串是否为空
测试整数
test int1 -eq int2。等于
test int1 -ge int2。>=
test int1 -gt int2。>
test int1 -le int2。<=
test int1 -lt int2。<
test int1 -ne int2
可以省略test : [int1 -lt init2]
文件测试
test -d file 测试是否为目录
test -f file 文件
test -x file 可执行
-r 可读
-w 可写
-e 文件是否存在
-s 是否是空文件
说明: 省略test : [-x file]
===== 流程控制 ====
If 条件 then 语句1 ( else 语句2 ) fi
扩展;分号表示两个两个命令写在一行互不影响
多条件
-a 或 && 逻辑与 -o 或 || 逻辑或