0、Shell中的特殊符号
1.$
美元符号,用来表示变量的值。
如变量NAME的值为Mike,则使用$NAME就可以得到“Mike”这个值。
2.#
井号,除了做为超级用户的提示符之外,还可以在脚本中做为注释的开头字母,每一行语句中,从#号开始的部分就不执行了。
3.“”
双引号,shell不会将一对双引号之间的文本中的大多数特殊字符进行解释。
如#不再是注释的开头,它只表示一个井号“#”。但$仍然保持特殊含义。
双引号对于某些特殊符号是不起作用的, 例如:”,$,\,`(反引号)
双引号和单引号不能嵌套。即:echo ‘””’ 输出””, echo “’’” 输出’’
4.‘’
单引号,shell不会将一对单引号之间的任何字符做特殊解释。
5.``
倒引号,命令替换。在倒引号内部的shell命令首先被执行,其结果输出代替用倒引号括起来的文本,不过特殊字符会被shell解释。
6.\
斜杠,用来去掉在shell解释中字符的特殊含义。在文本中,跟在\后面的一个字符不会被shell特殊解释,但其余的不受影响。
7.{}
大括号,主要是和$符号配合,作为字符串连接来使用
echo ${HOME}ismydir /home/qzkismydir
1、shell中的表达式
1.shell 输出/输入重定向
输出 >
将右尖括号前的命令的输入重定向到尖括号后的文件中。
ls *.sh > list.txt
将当前目录下所有末尾名为sh的文件的列表写入到list.txt
如果要将新内容添加在文件末尾,请使用>>操作符。
输入 <
将左箭头后面的文件作为左箭头前的命令的输入。
grep “a” < test.sh
将test.sh中找到所有包含a的行
command < infile > outfile 同时替换输入和输出,执行command,从文件infile读取内容,然后将输出写入到outfile中。
错误输出重定向
默认bash有3个标准输入输出设备。
- 0 标准输入
- 1 标准输出
- 2 错误输出
如果执行脚本的时候发生错误,会输出到2上。
要想就将错误的输出也输出在标准输出上,需要重定向。
./test.sh > a.log 2>&1
后面2>&1就是将标准错误的输出重定向到标准输出上。
3.tee
将此命令的输入分叉,一支输出到屏幕一支可以重定向到其他位置。
./test.sh | tee >a.txt 2>&1
运行test.sh,通过tee输出到a.txt,同时屏幕上可以看到输出。并且将错误输出重定向到标准输出( 2>&1 )
3.exec
将此命令后的参数作为命令在当前的shell中执行,当前的shell或者脚本不在执行。
2、脚本格式
脚本以#!/bin/bash 开头(指定解析器)
3、Shell中的变量
1.常用系统变量
$HOME、$PWD、$SHELL、$USER等
echo $USER xinghe
2.自定义变量
1、基本语法
(1)定义变量:变量=值
(2)撤销变量:unset 变量
(3)声明静态变量:readonly 变量,注意:不能 unset
2、变量定义规则
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
(2)等号两侧不能有空格
(3)在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算。
(4)变量的值如果有空格,需要使用双引号或单引号括起来。
(1)定义变量 A $ A=5 $ echo $A 5 (2)给变量 A 重新赋值 $ A=8 $ echo $A 8 (3)撤销变量 A unset A $ echo $A (4)声明静态的变量 B=2,不能 unset $ readonly B=2 $ echo $B 2 $ B=9 -bash: B: readonly variable (5)在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算 $ C=1+2 $ echo $C 1+2 (6)变量的值如果有空格,需要使用双引号或单引号括起来 $ D=hello world -bash: world: command not found $ D="hello world" $ echo $D hello world (7)可把变量提升为全局环境变量,可供其他 Shell 程序使用 export 变量名。
3.特殊变量:$n、$#、$*、$@、$?
$n (功能描述:n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,十以上的参数需要用大括号包含,如${10})
$# (功能描述:获取所有输入参数个数,常用于循环)。
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体(一个字符串))
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
4、Shell 数组
数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小,数组元素的下标由 0 开始。
Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:
array_name=(value1 value2 ... valuen)
也可以使用下标来定义数组:
array_name[0]=value0 array_name[1]=value1 array_name[2]=value2
读取数组
读取数组元素值的一般格式是:
${array_name[index]}
获取数组中的所有元素
使用@ 或 * 可以获取数组中的所有元素
${array_name[*]} ${array_name[@]}
获取数组的长度
获取数组长度的方法与获取字符串长度的方法相同,例如:
#!/bin/bash my_array[0]=A my_array[1]=B my_array[2]=C my_array[3]=D echo "数组元素个数为: ${#my_array[*]}" echo "数组元素个数为: ${#my_array[@]}"
执行脚本,输出结果如下所示:
$ chmod +x test.sh $ ./test.sh 数组元素个数为: 4 数组元素个数为: 4
5、运算符
1.基本语法
(1)expr + , - , * , / , % 加,减,乘,除,取余
(2)“$((运算式))”或“$[运算式]”
注意:expr 运算符间要有空格
(1)计算 3+2 的值 expr 2 + 3 5 (2)计算(2+3)X4 的值 (a)expr 一步完成计算 expr `expr 2 + 3` \* 4 20 (b)采用$[运算式]方式 res=$((2+3)) res=$[((2+3)*4)]
6、条件判断
1.基本语法
[ condition ](注意 condition 前后要有空格)
注意:条件非空即为 true,[ qiuzhi ]返回 true,[] 返回 false。
2.常用判断条件
(1)两个整数之间比较
= 字符串比较
-lt 小于(less than) -le 小于等于(less equal) -gt 大于(greater than) -ne 不等于(Not equal) -eq 等于(equal) -ge 大于等于(greater equal)
(2)按照文件权限进行判断
-r 有读的权限(read) -x 有执行的权限(execute) -w 有写的权限(write)
(3)按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file) -e 文件存在(existence) -d 文件存在并是一个目录(directory) (1)23 是否大于等于 22 [ 23 -ge 22 ] echo $? 0 (2)helloworld.sh 是否具有写权限 [ -w helloworld.sh ] echo $? 0 (3)/home/atguigu/cls.txt 目录中的文件是否存在 [ -e /home/qiuzhi/cls.txt ] echo $? 1 (4)多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失 败后,才执行下一条命令) [ -w helloworld.sh ] && echo OK || echo notok OK [ -w helloworld1.sh ] && [ ] || echo notok notok
7、流程控制
1.if 判断
1、基本语法
if [条件判断式] then 程序 fi 或者 if [条件判断式] then 程序 elif [ 条件判断式 ] then 程序 else 程序 fi
注意事项:
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if 后要有空格
2.case 语句
1、基本语法
case $变量名 in "值 1") 如果变量的值等于值 1,则执行程序 1 ;; "值 2") 如果变量的值等于值 2,则执行程序 2 ;; ...省略其他分支... *) 如果变量的值都不是以上的值,则执行此程序 ;; esac
注意事项:
- case 行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
- 双分号“;;”表示命令序列结束,相当于 java 中的 break。
- 最后的“*)”表示默认模式,相当于 java 中的 default,*不可以加双引号。
3.for 循环
1、基本语法 1
for ((初始值;循环控制条件;变量变化)) do 程序 done
2、基本语法 2
for 变量 in 值 1 值 2 值 3... do 程序 done
比较$*和$@区别
(a)$*和$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n 的形式输出所有参数。
(b)当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “$2”…”$n” 的形式输出所有参数。
4.while 循环
1、基本语法
while [ 条件判断式 ] do 程序 done
注意事项:
while 后面需要有空格
8、read 读取控制台输入
1.基本语法
read(选项)(参数)
选项:
- -p:指定读取值时的提示符;
- -t:指定读取值时等待的时间(秒)。
参数
- 变量:指定读取值的变量名