注:请注意红色标注部分
一:语法
1. 变量
1.变量名规范
- 名称只能使用英文字母,数字和下划线,不能是数字开头
- 名称中间不能有空格
- 不能使用标点符号
- 不能使用bash里面的关键字
2.变量使用
- 使用变量的时候可以用
变
量
名
也
可
以
用
变量名也可以用
变量名也可以用{变量名}。这里的{}的作用是用来区分变量的边界的,像是下面这种情况中,加不加{}都可以
var1="test var"
echo $var1
echo ${var1}
注:在声明变量的时候,变量名,=,变量值三者之间不可以有空格哦
在使用变量的时候是否需要加{}取决于编译器能否正确识别出变量名 如:
i=2
echo "$is"
echo "${i}s"
如上面这种情况,当使用变量i的时候,就需要用{i}。是因为$is这种没有空格分隔的写法,编译器无法识别出变量名是i还是is,那么就会将变量名作为is来编译。通过上面代码中的颜色也可以很清楚的看出来变量引用部分,为黄色
单引号和双引号的区别: echo ‘’ 的时候,会把‘’中的内容原样输出 echo ""的时候,如果有包含变量的时候,那么$变量会生效
i=0
echo '$i'
echo "$i"
输出:
$i
0
2. 脚本参数传递
变量 | 意义 |
---|
$# | 传递到脚本的参数个数 | $* | 以单字符的方式显示传递的所有参数 | $$ | 脚本当前运行的进程ID | $! | 后台运行的最后一个进程的ID | $@ | 分开显示传递的所有参数 | $? | 显示最后命令退出的状态,0表示正常,其他值表示有错误 |
[root@centos7-01 an]# sh a.sh c1 c2 c3 c4
4
c1 c2 c3 c4
22430
c1 c2 c3 c4
0
c1
c3
[root@centos7-01 an]# cat a.sh
#!/bin/bash
echo "$#" ---- 4
echo "$*" ---- c1 c2 c3 c4
echo "$$" ---- 22430
echo "$!" ----
echo "$@" ---- c1 c2 c3 c4
echo "$?" ---- 0
echo "$1" ---- c1
echo "$3" ---- c3
3. 数组
- 定义:数组用括号来表示,用空格符号分隔开。
如array_name=(value1 value2 … valuen) - 也可以通过arr[1]='xxx’的方式来进行赋值
- 读取数组元素:${arr_name[index]}
- 一次性获取数组中的所有元素:$ {arr_name[*]}或者$ {arr_name[@]}
- 获取数组的长度:$ {#arr_name[*]}或者${#arr_name[@]}
[root@centos7-01 an]
myArr=(1 2 A df)
echo "数组长度为${#myArr[*]}"
myArr[4]="89"
echo "增加元素后,数组长度为${#myArr[@]}"
echo "第三个元素是${myArr[2]}"
echo "输出所有元素:${myArr[*]}"
echo "输出所有元素:${myArr[@]}"
[root@centos7-01 an]
数组长度为4
增加元素后,数组长度为5
第三个元素是A
输出所有元素:1 2 A df 89
输出所有元素:1 2 A df 89
4. 运算符
原生的shell是不支持运算符的,但是可以通过一些其他命令来实现shell运算的功能。如awk何expr
- expr:表达式计算工具,使用的时候需要反引号来指定,即``,而且运算符和数值之间需要用空格隔开
[root@centos7-01 an]# cat a.sh
#!/bin/bash
echo `expr 2 + 2`
a=2
b=4
#注意如果是*运算符,需要进行转义
echo `expr $a \* $b`
[root@centos7-01 an]# sh a.sh
4
8
5. if
- 语法: if [ 关系表达式 ]
[root@centos7-01 an]
2!=4
[root@centos7-01 an]
a=2
b=4
if [ $a -eq $b ]
then
echo "$a==$b"
else
echo "$a!=$b"
fi
- 支持的运算符
运算符 | 含义 | 示例 |
---|
-eq | 两个数是否相等 | [ $a -eq $b ] | -ne | 两个数是否不相等 | [ $a -ne $b ] | -gt | 是否是大于的关系 | [ $a -gt $b ] | -lt | 是否是小于的关系 | [ $a -lt $b ] | -ge | 是否是大于等于的关系 | [ $a -ge $b ] | -le | 是否是小于等于的关系 | [ $a -le $b ] | ! | 非运算符 | [ !false ] | -o | 或运算符 | [ true -o false ] | -a | 且运算符 | [ $a = $b -a false] | = | 左右是否相等 | [ $a = $b ] | != | 左右是否不等 | [ $a != $b ] | -z | 长度是否为0 | [ -z $a ] | -n | 长度是否不为0 | [ -n “$a” ] | $ | 是否为空 | [ $a ] |
注:对于逻辑运算符,需要使用[[ ]] 双中括号来运行
逻辑运算符 | 含义 | 示例 |
---|
&& | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] | || | 逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]] |
[root@centos7-01 an]
a=2
b=4
if [ $a -eq $b ]
then
echo "$a==$b"
else
echo "$a!=$b"
fi
if [ $a -ne $b ]
then
echo "$a-ne$b"
fi
if [ $b -gt $a ]
then
echo "$b-gt$a"
fi
if [ $a -lt $b ]
then
echo "$a-lt$b"
fi
if [ $b -ge $a ]
then
echo "$b-ge$a"
fi
if [ $a -le $b ]
then
echo "$a-le$b"
fi
if [ ! $a -ge $b ]
then
echo "!$a -ge $b"
fi
if [ $a -ge $b -o $a -lt $b ]
then
echo "$a -ge $b -o $a -lt $b"
fi
if [ $a -le $b -a $a -lt $b ]
then
echo " $a -le $b -a $a -lt $b "
fi
if [ $a = `expr $b - 2` ]
then
echo " [ $a = `expr $b - 2` ] "
echo ' [ $a = `expr $b - 2` ] '
fi
if [ -z '' ]
then
echo "[ -z '' ]"
fi
if [ -n $a ]
then
echo "[ -n $a ]"
fi
if [ $a ]
then
echo "[ $a ]"
fi
输出结果:
[root@centos7-01 an]
2!=4
2-ne4
4-gt2
2-lt4
4-ge2
2-le4
!2 -ge 4
2 -ge 4 -o 2 -lt 4
2 -le 4 -a 2 -lt 4
[ 2 = 2 ]
[ $a = `expr $b - 2` ]
[ -z '' ]
[ -n 2 ]
[ 2 ]
- 支持的文件运算符
运算符 | 含义 |
---|
-b | 文件是否是块设备文件 | -c | 文件是否是字符设备文件 | -d | 文件是否是目录 | -f | 文件是否是文件(非设备文件) | -g | 文件是否设置了SGID 位 | -k | 文件是否设置了粘着位(Sticky Bit) | -p | 文件是否是有名管道 | -u | 文件是否设置了 SUID 位 | -r | 文件是否可读 | -w | 文件是否可写 | -x | 文件是否可执行 | -s | 文件是否为空即文件大小是否为0 | -e | 文件是否存在 |
6. for
[root@centos7-01 an]
myArr=( 1 2 3 4 )
for i in ${myArr[*]}
do
echo $i
done
for i in a b c d
do
echo $i
done
[root@centos7-01 an]
1
2
3
4
a
b
c
d
7. while
- 语法格式
while (( )) do xxx done
[root@centos7-01 an]
i=1
while(( $i<= 5 ))
do
echo "$i"
i=`expr $i + 1`
done
[root@centos7-01 an]
1
2
3
4
5
无限死循环
#!/bin/bash
i=1
while :
do
echo "$i"
done
#!/bin/bash
i=1
while true
do
echo "$i"
done
#!/bin/bash
i=1
for (( ; ; ))
do
echo "$i"
done
8. until
[root@centos7-01 an]
1
[root@centos7-01 an]
i=1
until [ $i -eq 0 ]
do
echo "$i"
i=0
done
9. case
case xxx in
1) command
;;
2) command
;;
*) command
;;
esac
case 标识着case命令的开始 esac标识着case命令的结束 n)标识着一个特定的取值模式,n可以一个明确的值,也可以是枚举 ;; 标识该模式匹配的结束 *)相当于是的default
[root@centos7-01 an]
i=you
case $i in
1) echo "i like"
;;
"you") echo "you like"
;;
*) echo "all like"
esac
[root@centos7-01 an]
you like
10. break,continue
break标识跳出一个循环:for,while,until continue标识停止当前循环,直接开启下一次循环
11. function
[ function ] funname [()]
{
action;
[return int;]
}
示例
[root@centos7-01 an]
1
10
13
[root@centos7-01 an]
i=you
function myFun(){
echo "$1"
echo "$10"
echo "${10}"
}
myFun 1 2 3 4 5 6 7 8 9 13 14 15
需要注意的是,当使用参数的时候,如果参数的个数超过10个的话,那么大于等于第10个的参数的使用需要时$ {n}的格式,而不是$ n,从上面的例子中也可以看出来,当使用$ 10的时候,输出的是10,但是使用$ {10}的时候输出的是真实的第10个数字
12. 重定向
- command > file :将command的执行结果完全输出到file中,覆盖file操作
- command >> file:将command的执行结果输出到file中,追加file操作】
- command < file:将file作为输入,来执行command
- 标准输入文件(stdin):文件描述符为0;如command < file,会把file作为stdin
- 标准输出文件(stdout):文件描述符为1;如command > file, 会把stdout重定向到file
- 标准错误文件(stderr):文件描述符为2;如command 2>file,会把stderr重定向到file
command > file 2>&1:会把stdout和stderr合并输出到file中
13. Here Document
command << delimiter
document
delimiter
如上述语法中,会把delimiter之间的document作为stdin给command
[root@centos7-01 an]
3
[root@centos7-01 an]
wc -l << delimiter
2
3
4
delimiter
14. /dev/null
/dev/null 作为一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
常用法:可以使用$ command > /dev/null 2>&1 来屏蔽输出
15. printf
语法:
printf format-string [ args... ]
format-string:格式控制字符串 args:参数列表
格式化字符 | 意义 |
---|
%[-n]s | 字符串 ,如果指定了n的话,那么字符串就会显示在10个字符宽内,长度不够的话不空格,如果长度大于10个字符全部显示。如果指定了-表示左对齐,否则就是右对齐 | %d | 整数 | %c | 单个字符 | %[-n.m]f | 小数, m指的是格式化为即为小数 |
|