shell脚本,接近内核的脚本语言
语言学习:语法-应用-框架-中间件
Shell
弱类型
shell脚本需要用#! /bin/bash开头,相当于声明一个shell脚本
#注释
为了操作内核
sh、csh两大主流
sh:bash sh
csh: csh tcsh
脚本执行
1.输入绝对路径或相对路径
必须为一个可执行文件
/shell/name
./name
2.bash 或 sh+脚本
sh hello.sh
当脚本没有x权限时,root和文件所有者通过该方式可以执行脚本
3.脚本路径前加 . 或source
source hello.sh
. hello.sh
区别
第一和第二会新开一个bash,不同的bash中的变量无法共享
source是在同一个shell里面执行
作用域不同
变量数据传递
export
export:将当前进程的变量传递给子进程去使用,
将来配置profile的时候,所有的变量前必须加export让子进程可见
export age=18
//使用此方式定义的变量在所有中都可以取到
echo $age
变量引用顺序:当前进程出发,当前进程没有该变量就到父进程查询
如果使用export变量修饰后,该变量对于子进程可见
语法
变量
定义
只能英文字母、数字、下划线,不能数字开头
不可使用关键字
变量类型
局部变量:在脚本或者命令中定义,仅在shell实例中有效,其他shell启动的程序不能访问局部变量
环境变量:所有程序都能访问的变量
shell变量
由shell程序设置的特殊变量,一部分是环境变量,一部分是局部变量。
#变量声明
name=1
#变量调用
echo $name
echo ${name}
#变量只读
url="www.baidu.com"
readonly url
#变量删除
unset name
字符串
单引号、双引号、无引号
单引号:原样输出,单引号不能出现单独的单引号但可以成对出现,作为字符串的拼接
#拼接
name=aaa
temp=''$name'bbb'
temp1='$namebbb'
echo $temp
#aaabbb
echo $temp1
#$namebbb
双引号:可以转义,可以有变量
#定义变量123,用不同的方式定义3查看输出结果
name1=zhangsan
name2=$name1
name3='$name2 shuchu'
echo $name3
#$name2 shuchu
name3="$name2 shuchu"
echo $name3
#zhangsan shuchu
${}用法
name=123
#输出长度 ${#}
echo ${#name}#输出 3
#字符串切片${name:start:length}
echo ${name:0:2}#输出12
#start和length可省略
#从start位切多长.
#字符串替换${str/a/b}将str中的a串替换为b串
#a可以使用正则串匹配
#开头一个正斜杠为只匹配遇到的第一个字符串
#两个正斜杠为匹配所有遇到的字符。
echo ${name/1/5}#第一个1替换为5
name=java hello java
echo ${name//java/shell}#将所有的java换成shell
#字符串截取,可以看做删除指定字符串
#有点笨,只能从头或者从尾,可以用通配符,[seq]字符序列
#例如[a-b]
${str#}#从头截取,最短匹配,双##最长匹配
${str%}#从尾部截取,最短匹配,双%%最长匹配
url=http://www.baidu.com/a
echo ${url#*//}#输出www.baidu.com/最短匹配
echo ${url##*/}#输出a,最长匹配
echo ${url%/a}#输出http://www.baidu.com
数组
bash支持一维数组,不支持多维数组,没有限定数组大小
#定义方法
name=("张三" "李四")
#读取,使用${name[下标]}
echo ${name[0]}
#获取所有元素,在下标处使用@或者*
echo ${name[@]}
echo ${name[*]}
#获取长度使用#,和普通变量一样
echo ${#name[@]}
运算符
普通的算术运算符都有
包括加减乘除取余赋值判等
乘法前必须加 / 转义
关系运算符
-eq#判断相等
-ne#判断不相等
-gt#相当于大于号
-lt#相当于小于号
-ge#大于等于
-le#小于等于
布尔运算符
!非运算
-o或
-a与运算
字符串运算符
&&逻辑and
||逻辑与
-z 长度是否为0
-n 是否不为0
$ 是否为空
使用方式
erp
a=1
b=2
echo `erp $a + $b`#输出3,中间要有括号
中括号
a=a
b=b
if [ $a = $b ]
then echo true
else echo false
fi
test
和中括号运算符比较相似
其中包含中括号运算中的字符串运算和关系运算
不同的是有文件测试
-e 文件名 -存在则为真
#后续所有的命令都包含存在这个条件
-r 文件名 且可读则为真
-w 文件名 且可写则为真
-x 文件名 且可执行则为真
-s 文件名 且至少有一个字符则为真
-d 文件名 且为目录则为真
-f 文件名 且为普通文件则为真
-c 文件名 且为字符型特殊文件则为真
-b 文件名 且为块特殊文件则为真
echo
#普通显示
echo
#-e 激活转义字符
echo -e
#>重定向到某文件
echo "hello" > file
#'原样显示'
转义字符
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;
流程控制
if
如果使用 ((…)) 作为判断语句,大于和小于可以直接使用 > 和 <。
if condition1
then command1
elif condition2
fi
case
case为多选择语句,可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令
case [value] in
model1)
command1
command2
...
;;#相当于
model2)
command1
command2
...
;;
esac
for
for var in
do
done
输出数组所有元素
str=("1" "2")
for s in "${str[*]}";do
echo $s;
done
while
用于不断执行一系列命令,也用于从输入文件中读取数据,命令通常为测试条件
while condition
do command
done
break
跳出整个循环
continue
跳出本次
函数(方法)
#定义
function name()
#或者
name()
#可以带return也可以不带return,不加的话将最后一条命令运行结果作为返回值,return后的值只能0-255
firstfun(){
return $((1+2))
}
#调用时直接
firstfun
#获取返回值可以直接赋给一个变量或者通过$?来获得