文章目录
Shell编程
一、基础概念
- 先创建一个文件以.sh为后缀名。
vi hello.sh
2.打开文件后,先写声明
#! /bin/bash //文件声明
3、运行脚本
#1、输入脚本的绝对路径或相对路径
#先修改文件的权限,让文件可以执行
chmod u+x hello.sh #假设脚本文件为hello.sh
./hello.sh #成功运行
#2、使用bash或者sh+脚本
sh hello.sh #成功执行
#sh 可以不用修改文件权限,普通文件也可以执行
#3、使用source执行。
source hello.sh
方法1,2都会开启新的bash进程
方法3不会开启新进程
影响:
定的环境变量不知道在哪层。所以要加上export,
二、基础入门
1、变量
- 名字只能是英文字母,下划线,数字,首个字符不能以数字开头
- 中间不能有空格,可以使用下划线
- 不能用标点符号
- 不能使用bash里面的关键字
变量类型:
- 局部变量
局部变量在脚本或命令中定义,仅当前shell实例中有效,其它shell启动的程序不能访问。 - 环境变量
所有的程序,包括shell启动的程序,都能访问环境变量。 - Shell变量
shell变量由shell程序设计的特殊变量。
#变量的声明
name=zhangsan
#变量的调用
echo $name #打印出 zhangsan
readonly name #把name设置成只读变量
#删除变量
unset name #删除name变量
2、字符串
字符串可以用单引号,也可以用双引号,也可以不用引号。
单引号:
- 单引号里面的字符都会输出,变量无效。
双引号:
- 双引号里面可以有变量。
- 双引号里面可以出现转义字符。
name=zhangshan
username="hello,&name"
echo $username #输出结果 hello,zhangsan
username='hello,&name'
echo $username #输出结果 hello,&name
#打印字符串的长度
echo ${#name} #打印出字符串长度
3、数组
- bash支持一维数组(不支持多维数组),并且没有限定数组大小。
- 数组元素的下标从0开始,获取数组元素要利用下标获取。
#定义数组
数组名={值1 值2 值3.。。。} #每个值用空格隔开
favl={"张三" "王五" "李达"}
#读取数组 ${数组名[下标]}
fav=${favl[0]}
#使用@ 获取数组全部元素
echo ${favl[@]}
#获取数组长度
len=${#favl[@]}
4、Shell的注释
#为Shell的注释
#这就是Shell的注释符
5、参数传递
参数处理 | 参数说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID |
$! | 后台运行的最后一个进程ID |
$? | 显示最后命令的退出状态,0表示没有错误,其他数值表示有错误 |
$0 | 执行文件的名字 |
#hello.sh 文件内容
echo "文件名字=$0"
echo "第一个参数=$1"
echo "第二个参数=$2"
echo "第三个参数=$3"
#执行hello.sh文件,并传递参数
. /hello.sh 11 22 33
#运行结果
文件名字=/hello.sh
第一个参数=11
第二个参数=22
第三个参数=33
6、运算符
- 关系运算符
- 算数运算符
- 布尔运算符
- 逻辑运算符
- 字符串运算符
- 文件测试运算符
6.1、算数运算符
a=20
b=10
var=` expr $a + $b ` #`这个字符在esc下面,` `包起来的内容当做命令使用
echo "a+b : $var"
var=` expr $a - $b `
echo "a-b :$var"
var=` expr $a \* $b ` #*是通用符,需要转义,转成乘号
echo "a*b :$var"
var=` expr $a / $b `
echo "a/b :$var"
var=` expr $a % $b `
echo "a%b :$var"
if[ $a == $b ]
then
echo "a==b"
fi
if[ $a != $b ]
then
echo "a!=b"
fi
6.2、关系运算符
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a等于b"
else
echo "$a -eq $b : a不等于b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b : a不等于b"
else
echo "$a -ne $b : a等于b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b : a大于b"
else
echo "$a -gt $b : a不大于b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b : a小于b"
else
echo "$a -lt $b : a不小于b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b : a大于等于b"
else
echo "$a -ge $b : a不大于等于b"
fi
if [ $a -le $b ]
then
echo "$a -le $b : a小于等于b"
else
echo "$a -le $b : a不小于等于b"
fi
6.3、布尔运算符
#组合关系运算符
if [$a -lt 100 -a $b -gt 15]
then
echo "$a小于100并且b大于15 :返回true"
else
echo "返回false"
fi
if [$a -lt 100 -o $b -gt 15]
then
echo "$a小于100或者b大于15 :返回true"
else
echo "返回false"
fi
6.4、逻辑运算符
if [ [ $a -lt 100 && $b -gt 15 ] ]
then
echo "返回true"
else
echo "返回false"
fi
if [[ $a -lt 100 || $b -gt 15 ]]
then
echo "返回true"
else
echo "返回false"
fi
6.5、字符串运算符
a="abc"
b="efg"
if [ $a == $b ]
then
echo "$a=$b :a等于b"
else
echo "不等于"
fi
if [ -z $a ]
then
echo"字符串长度为0"
else
fi
if [ -n $a ]
then
echo"字符串长度不为0"
else
fi
if [ $a ]
then
echo"字符串不为空"
else
fi
6.6、文件测试运算符
file="/var/node"
if[ -r $file ]
then
echo"文件可读"
else"文件不可读"
fi
if[ -w $file ]
then
echo"文件可写"
else"文件不可写"
fi
if[ -x $file ]
then
echo"文件可执行"
else"文件不可执行"
fi
if[ -f $file ]
then
echo"文件为普通文件"
else"文件为特殊文件"
fi
if[ -d $file ]
then
echo"文件是目录"
else"文件不是目录"
fi
if[ -s $file ]
then
echo"文件不为空"
else"文件为空"
fi
if[ -e $file ]
then
echo"文件存在"
else"文件不存在"
fi
7、echo打印数据
#显示普通字符串
echo "Hello,world"
#显示转义字符
echo "\"Hello,world\""
#显示变量
name="zhangsan"
echo "$name"
#显示换行
echo -e "OK! \n"
echo "Hello,word"
#显示不换行
echo -e "OK! \c"
echo "Hello,World"
##显示结果定向至文件
echo "Hello,world" > myfile
#原样输出字符串
echo '$name\"'
#显示命令执行结果
echo `date`
8、test命令
test,包含6、运算符里面的全部操作。区别是:test时不需要[ ]符号。
if test $[a] == $[b]
then
echo "a==b"
fi