shell特点:
- 解释非编译型
- 弱类型
- 执行模式:交互/批处理模式
第一个shell脚本
vim first.sh
#!/bin/bash
echo "hello world!"
注意:
- #!叫做“”shebang“是一个约定的标记,告诉系统这个脚本使用哪一种shell。
- echo命令用于向窗口输出文本
执行方式4种:
-
1.
chmod +x test.sh
执行
./test.shm
- ./的含义是就在当前目录中找
- 执行本质原理:shell会fork一个子进程并调用exec执行./first.sh这个程序,exec系统调用应该把子进程的代码段替换成./first.sh程序的代码段,并从它的_start开始执行。然而first.sh是个文本文件,根本没有代码段和_start函数!咋办?exec还有另一种机智:如果要执行的是一个文本文件,并且第一行用shebang指定了解释器,则用解释器程序的代码段替换当前进程,并从解释器的_start开始执行,而这个文本文件被当做命令行参数传给解释器。 2.
/bin/bash test.sh #作为解释器参数,直接运行解释器
-
3.
bash shell.sh
4.
sh shell.sh
注意:
- shell.sh是子进程执行
source shell.sh
是让父进程执行,不创建子进程
shell中的变量:
1. 数字、字符串:
myint=100 #等号两侧不能有空格
echo $myint #访问变量
mystr=hello
echo ${mystr}world #字符串拼接,用{ }表示变量名
readonly mystr=hehe #这个变量不允许修改
unset mystr
export myval =hehe #创建了一个环境变量,可被子进程继承
2.字符串表示:
"hello" 'hello' hello
3.字符串拼接:
hello="hello"
world="world"
echo $helloworld
4.获取一个字符串的长度
str='hehe'
echo ${#str} # #为长度
5.取子字符串
str="hehehehe"
echo ${str:2:4} #{变量名字:从第二个开始取:取4个}
6.通配符
* # 匹配0个或多个任意字符
? # 匹配一个任意字符
[若干个字符] # 匹配方括号中任意一个字符的一次出现
for i in{1..100}
do
touch file.$i
done
ls file.*
或 ls file.[13579]*
或 ls file.[1-5]*
或 ls file.?
7.命令代换
date #显示时间
1. today=`date +"%y%m%d %H:%M:%S"` #`` 反引号
2. today=$(date+"%m%d")
8.算术代换
a=1
b=1
c=$(($a+$b)) #(()) 括号中的语法类似C语言
echo $c
9.转义字符
\0 \1 \2
touch \$\ \$ #$ $
显示 - :-- -