- shell的编码语法
shell脚本的第一行内容是: #!/bin/bash,这句话相当于是一个导包语句,将shell的执行环境引入进去了。
shell中变量的命名要求:
只能使用数字、字母和下划线,且不能以数字开头
变量赋值是通过"="进行赋值,在变量、等号和值之间不能出现空格!
有两种写法:$name(简化写法)、${name}
如果我们想在变量的结果后面直接无缝拼接其它字符串,那就只能使用带花括号的形式
变量分为四类:
本地变量:本地变量就只在当前shell脚本中有效。
环境变量:临时环境变量(export VAR_NAME=VALUE),/etc/profile(永久生效)
位置变量:类似于java传参
执行结果
[root@bigdata01 shell]# sh location.sh abc xyz
location.sh
abc
xyz
特殊变量:$?、$#
$?:它表示是上一条命令的返回状态码,状态码在0~255之间
状态码 描述
0 命令成功结束
1 通用未知错误127 没找到命令
128 无效退出参数
128+x Linux信号x的严重错误130 命令通过Ctrl+C控制码越界
255 退出码越界
$#:它表示的是shell脚本所有参数的个数
引号+变量的使用
首先是单引号 ' ' 单引号不解析变量
[root@bigdata01 shell]# name=jack
[root@bigdata01 shell]# echo '$name'
$name
然后再看一下双引号," ":双引号解析变量
[root@bigdata01 shell]# name=jack
[root@bigdata01 shell]# echo "$name"
jack
反引号``
[root@bigdata01 shell]# name=jack
[root@bigdata01 shell]# echo `$name`
-bash: jack: command not found
反引号是执行并引用命令的执行结果,在这里反引号是获取到了name变量的值,然后去执行这个值,结果发现没有找到这个命令。如果我们把name的值改为pwd,来看一下效果,这样就会执行pwd,并且把pwd执行的结果打印出来。
[root@bigdata01 shell]# name=pwd
[root@bigdata01 shell]# echo `$name`
/root/shell
反引号还有另一种写法,$() 效果一致
如果我想打印 'pwd',外面有个单引号
[root@bigdata01 shell]# echo "'$name'"
'pwd'
逻辑运算符:
for循环:
for((i=0;i<10;i++))
do
循环体...
done
do也可以和for写在一行,只是需要加一个分号;
for((i=0;i<10;i++));do
循环体...
done
for...in 写法
for i in 1 2 3
do
循环体...
done
while循环:
while 测试条件
do
循环体...
done
测试条件:整型:-gt(大于)、-lt(小于)、-ge(大于等于)、-le(小于等于)、-eq(等于)、-ne(不等于)
#!/bin/bash
while test 2 -gt 1
do
echo yes
sleep 1
done
还有一种写法(个人比较喜欢)
#!/bin/bash
while [ 2 -gt 1 ]
do
echo yes
sleep 1
done
#!/bin/bash
while [ "abc" = "abc" ]do
echo yes
sleep 1
done
if 分支语句:
#!/bin/bash
flag=$1
if [ $flag -eq 1 ]
then
echo one
fi
双分支
#!/bin/bash
#用户没有传入参数
if [ $# -lt 1 ]
then
echo "not found param"exit 100
fi
#读取第一个参数
flag=$1
if [ $flag -eq 1 ]
then
echo "one"
else
echo "not support"fi
还可以类似于Java的else if
#!/bin/bash
if [ $# -lt 1 ]exit 100
fi
flag=$1
if [ $flag -eq 1 ]
then
echo "one"
elif [ $flag -eq 2 ]then
echo "two"
elif [ $flag -eq 3 ]
then
echo "three"
else
echo "not support"
fi
- shell 的执行
1、bash abc.sh
2、sh abc.sh
3、加上文件执行权限,chmod u+x abc.sh
# 一个综合案例
nohup hello.sh >/dev/null 2>&1 &
# 解析
nohup和&:可以让程序一直在后台运行
/dev/null:是linux中的黑洞,任何数据扔进去都找不到了
>/dev/null:把标准输出重定向到黑洞中,表示脚本的输出信息不需要存储
2>&1 :表示是把标准错误输出重定向到标准输出中,标准输出可以使用文件描述符1来表示,标准错误输出可以使用文件描述符2来表示
- shell 的调试 如:bash -x hello.sh
1、-x
:启用调试模式。在此模式下,Bash 会逐行执行脚本,并打印出每一行命令及其执行结果。
2、假设脚本如下
#!/bin/bash
name="World"
echo "Hello, $name!"
3、执行结果,打印出每一行命令及其执行结果。
+ name=World
+ echo 'Hello, World!'
Hello, World!