shell的一些特殊符号,特殊用法
echo {1..10} //代表的是 1 2 3 4 5 6 7 8 9 10
echo {1..10..2} //代表的是 1 3 5 7 9 步长为2
echo {a..z}
echo {a,b,c} //输出了 a,b,c
'' 单引号 意义 是什么就是什么 很直
"" 双引号 只能识别变量 命令不认识
`` 反引号 当做命令执行 什么都认识 一个命令会调用另外一个命令的执行结果的时候 与$() 一样的效果,运行命令的结果
0 代表成功,1-255代表失败 $? 变量保存最近的命令退出状态
弱类型语言
a=1
echo $a
-----------------------------------------------------------------------
[root@localhost ~]$ NAME=he
[root@localhost ~]$ TITLE=ceo
[root@localhost ~]$ echo $NAME is $TITLE
he is ceo
[root@localhost ~]$ echo $NAME is $TITLE -b
he is ceo -b
[root@localhost ~]$ echo $NAMExiaofei is $TITLE -b
is ceo -b
[root@localhost ~]$ echo ${NAME}xiaofei is $TITLE -b
hexiaofei is ceo -b
name="ni sadsal jdsial"
值中没有空格的话,可以不用加引号,如果有空格的话,就要加上引号,否则报错
systeminfo.sh
CMD=hostname
$CMD //直接输出这个变量,相当于运行变量中保存的命令
--------------------------------------------------------------------------------------------------------------
shell 脚本格式 shebang格式
第一行 #!/usr/bash #!shell类型
运行 无执行权限 bash hello.sh 有执行权限,直接输入脚本的路径就可以执行。source 也可以执行脚本,但是source是在当前的进程中去运行的,可以改变当前的环境。所以source多用来配置文件的生效,而bash 运行脚本,是在开启一个子shell下运行的。运行结束子进程的shell也就会结束,不会影响当前的环境
执行过程:本质就是我们写的Linux命令,一行写一个,然后逐行去运行。一般的默认错误或者正确的输出都会输出(除了中断的问题)。在脚本中也可以使用“;” ,一条命令写多行就用 分开
当脚本出现错误时,分为两种
1语法错误,遇到这种错误,shell就不会往下执行了,就会退出了,之前的还是会执行,因为是一行一行的执行的
2逻辑错误,这种情况只是逻辑错误而已,不会全部退出,还是会一行一行往下执行的。
3脚本的运行是在一个子shell中运行的。
检查语法 bash -n user.sh 跟踪每一行的执行结果bash -x user.sh
变量用完之后,记得删 unset name1 name2
一般我们在shell里定义的变量,只能存在当前shell,不同的终端登录,不同的shell进程(父子shell进程),这些都是独立的shell进程。访问不到其他shell中的变量
export NAME //设置环境变量 ,环境变量可以多个shell都可以访问到,只能从上往下传,不能从下往上传。上面创建的环境变量,下面可以访问到,也可以修改值。再往下传的话,就是修改过后的值,但是上面的bash还是原来的值,也就是只能对下面有效。
env 列出当前全部的环境变量
(umask 066;touch f1) //内部产生了一个子shell 只对()内的命令有效,虽然()会开启一个子进程去运行,但是这个子进程还能访问到父进程的一些变量(不是环境变量的变量),所以这个很特殊。其他的子shell都获取不了父进程的变量。
{ } 相当于代码段,作为一个整体了。而且花括号里面的命令,结尾都要加;。包括最后一个
===================================================================================
bash中的算术运算
算数 var=$[算术表达式] 算数表达式中 变量的引用不能加""
[root@localhost ~]$ a=1
[root@localhost ~]$ b=2
[root@localhost ~]$ c=$[a+b]
[root@localhost ~]$ echo $c
3
[root@localhost ~]$ echo $[$a+$b]
3
[root@localhost ~]$ echo $[20+$b]
22
生成 0 - 49 之间随机数 echo $[$RANDOM%50]
===================================================================================
条件判断
与或 计算 短路与 短路或 在Linux shell 中 0 代表成功,1-255代表失败 1为真 0为假
命令1 && 命令1的结果为真 运行这里 || 命令1的结果为假 则运行这里
注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命 令后面的数字
命令1 && 命令1的结果为真 运行这里 || 命令1的结果为假 则运行这里
判断表达式(注意 变量都加上引号 "$a")
- test EXPRESSION
- ?[ EXPRESSION ]
- ?[[ EXPRESSION ]]
数值的比较判断: [ EXPRESSION ]
-gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于
[ $USE -ge 80 -o $USE_I -ge 80 ] -o 或者 -a 并且
字符串 的比较
= 是否等于
> ascii码是否大于ascii码
< 是否小于
!= 是否不等于
=~ 左侧字符串是否能够被右侧的PATTERN所匹配 注意: 此表达式一般用于[[ ]]中; 扩展的正则表达式
-z "STRING“ 字符串是否为空,空为真,不空为假
-n "STRING“ 字符串是否不空,不空为真,空为假,不用加-n 效果也是一样的
注意:用于字符串比较时的用到的操作数都应该使用引号
文件的比较
-e FILE: 文件存在性测试,存在为真,否则为假
-b FILE:是否存在且为块设备文件
-c FILE:是否存在且为字符设备文件
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-r FILE:是否存在且可读
-w FILE: 是否存在且可写
-x FILE: 是否存在且可执行
多个条件的组合判断
第一种。只适合[]:
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION
第二种
file=/date/test.sh;[[ $file =~ .sh$ ]] && [ -x "$file" ] && $file
位置变量
$1, $2, ... 对应第1、第2等参数,shift [n]换位置
$0 命令本身的路径
$* 传递给脚本的所有参数,全部参数合为一个字符串
$@ 传递给脚本的所有参数,每个参数为独立字符串
$# 传递给脚本的参数的个数
if 条件语句
单分支
双分支
if 也可以用命令退出状态做判断
if ping -c1 -W2 station1 &> /dev/null; then
echo 'Station1 is UP'
elif grep "station1" ~/maintenance.txt &> /dev/null; then
echo 'Station1 is undergoing maintenance'
else
echo 'Station1 is unexpectedly DOWN!'
exit 1
fi
写成单行的话: if [ "$PS1" ]; then echo test is ok; fi
写成分开的话:
if [ "PS1" ] > then echo "test is ok" > fi test is ok
case判断
case 变量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
esac
case支持glob风格的通配符:
- *: 任意长度任意字符
- ?: 任意单个字符
- []:指定范围内的任意单个字符
- a|b: a或b
read
[root@localhost ~]# read NAME AGE 自动忽略空格
hxf 20
[root@localhost ~]# echo $NAME $AGE
hxf 20
脚本安全
在最前面加上
set -u 当使用了没有声明的变量时,就会报错。避免使用没有声明的变量而产生空置的逻辑问题。
set -e 当某一条命令运行错误时,那就退出,不允许下面的命令了。如果不加,默认的脚本是,某一条命令出现问题,下面的命令还会运行。