导图社区 SHELL知识
关于SHELL知识的思维导图,包含基本语法:文件输出重定向、管道pipe、前台后台、逻辑运算;变量和参数;程序设计;程序调试。
编辑于2021-11-24 08:20:20SHELL
基本语法
文件输出重定向
每一个进程都有三个特殊的文件描述指针
标准输入(文件描述指针为0)
标准输出(文件描述指针为1)
标准错误输出(文件描述指针为2)
语句
command>file:将命令的输出结果重定向到一个文件。 command>&file:将命令的标准错误输出一起重定向到一个文件。 command&>file:表示标准输出和错误输出都定向到file文件中 command>>file:将标准输出的结果追加到文件中。 command>>&file:将标准输出和标准错误输出的结构都追加到文件中。
管道pipe
pipe同样可以在标准输入输出和标准错误输出间做代替工作,这样一来,可以将某一个程序的输出送到另一个程序的输入,其语法如下: command1| command2[| command3...] 也可以连同标准错误输出一起送入管道: command1| &command2[|& command3...]
前台后台
前台进程:command
后台进程:command&
逻辑运算
command1 && command2
左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行
command1 || command2
如果||左边的命令(command1)未执行成功,那么就执行||右边的命令(command2),即command1只有不成功,才执行command2
与或非
逻辑非 ! 条件表达式的相反 if [ ! 表达式 ] if [ ! -d $num ] 如果不存在目录$num
逻辑与 –a 条件表达式的并列 if [ 表达式1 –a 表达式2 ]
逻辑或 -o 条件表达式的或 if [ 表达式1 –o 表达式2 ]
变量和参数
用户定义变量
变量名=变量值
在定义变量时,变量名前不应加符号“$”,在引用变量的内容时则应在变量名前加“$”
给变量赋值时,等号两边一定不能留空格,若变量中本身就包含了空格,则整个字符串都要用双引号括起来
位置参数
获取参数值: $0 : 固定,代表执行的文件名 $1 : 代表传入的第1个参数 $n : 代表传入的第n个参数
$#:参数个数 $n: 以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数 $@:与$*相同,但是使用时加引号,并在引号中返回每个参数。 $$:脚本运行的当前进程号 $!:后台运行的最后一个进程的ID $?: 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 $* 与 $@ 区别 相同点:都是引用所有参数。 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
程序设计
test测试命令
数值测试
-eq:等于则为真 -ne:不等于则为真 -gt:大于则为真 -ge:大于等于则为真 -lt:小于则为真 -le:小于等于则为真
字符串测试
=:等于则为真 !=:不相等则为真 -z 字符串:字符串长度伪则为真 -n 字符串:字符串长度不伪则为真
文件名测试
-e 文件名:如果文件存在则为真 -r 文件名:如果文件存在且可读则为真 -w 文件名:如果文件存在且可写则为真 -x 文件名:如果文件存在且可执行则为真 -s 文件名:如果文件存在且至少有一个字符则为真 -d 文件名:如果文件存在且为目录则为真 -f 文件名:如果文件存在且为普通文件则为真 -c 文件名:如果文件存在且为字符型特殊文件则为真 -b 文件名:如果文件存在且为块特殊文件则为真
另外,Linux还提供了与(“!”)、或(“-o)、非(“-a”)三个逻辑操作符用于将测试条件连接起来,其优先级为:“!”最高,“-a”次之,“-o”最低。
if条件语句
if 条件命令串 then 条件为真时的命令串 else 条件为假时的命令串 fi
for循环
for 变量名 [in 数值列表] do 若干个命令行 done
while和until 循环
while 若干个命令行1 do 若干个命令行2 done
until 若干个命令行1 do 若干个命令行2 done
while循环在条件为真时继续执行循环,而until则是在条件为假时继续执行循环。
case 条件选择
case string in exp-1) 若干个命令行1 ;; exp-2) 若干个命令行2 ;; …… *) 其他命令行 esac
select
select var in ... ; do break done .... now $var can be used ....
break和continue
break 用于立即终止当前循环的执行,而contiune用于不执行循环中后面的语句而立即开始下一个循环的执行。这两个语句只有放在do和done之间才有效
函数定义
functionname(){}
调用函数:functionname param1 param2 ……
命令分组
()
shell执行()中的命令时将再创建一个新的子进程,然后这个子进程去执行圆括弧中的命令。
当用户在执行某个命令时不想让命令运行时对状态集合(如位置参数、环境变量、当前工作目录等)的改变影响到下面语句的执行时,就应该把这些命令放在圆括弧中
{}
用于将顺序执行的命令的输出结果用于另一个命令的输入(管道方式)。
当我们要真正使用圆括弧和花括弧时(如计算表达式的优先级),则需要在其前面加上转义符(\)以便让shell知道它们不是用于命令执行的控制所用。
运行shell
用chmod命令使shell程序成为可执行的
644(rw-r-r--)
sh shell程序文件名
程序调试
shell程序的调试主要是利用bash命令解释程序的选择项。
bash -选择项 shell程序文件名
-e:如果一个命令失败就立即退出 -n:读入命令但是不执行它们 -u:置换时把未设置的变量看作出错 -v:当读入shell输入行时把它们显示出来 -x:执行命令时把命令和它们的参数显示出来
bash内命令
echo
echo arg
eval
eval args
当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令,然后执行
exec
exec 命令 命令参数
功能:当shell执行到exec语句时,不会去创建新的子进程,而是转去执行指定的命令,当指定的命令执行完时,该进程,也就是最初的shell就终止了,所以shell程序中exec后面的语句将不再被执行。
export
export 变量名 或:export 变量名=变量值
功能:shell可以用export把它的变量向下带入子shell从而让子进程继承父进程中的环境变量。但子shell不能用export把它的变量向上带入父shell。
注意:不带任何变量名的export语句将显示出当前所有的export变l量
readonly
readonly 变量名
功能:将一个用户定义的shell变量标识为不可变的。不带任何参数的readonly命令将显示出所有只读的shell变量。
read
read变量名表
功能:从标准输入设备读入一行,分解成若干字,赋值给shell程序内部定义的变量。
shift
shift语句按如下方式重新命名所有的位置参数变量:$2成为$1,$3成为$2……在程序中每使用一次shift语句,都使所有的位置参数依次向左移动一个位置,并使位置参数“$#”减一,直到减到0。
wait
是shell等待在后台启动的所有子进程结束。Wait的返回值总是真。
exit
退出shell程序。在exit之后可有选择地指定一个数字作为返回状态。
.
. Shell程序文件名
功能:使shell读入指定的shell程序文件并依次执行文件中的所有语句。
脚本编写基础
开头必放:#!/bin/sh
符号#!用来告诉系统它后面的参数是用来执行该文件的程序
后面是路径,可改
注释:#
变量
环境变量
由export关键字处理过的变量叫做环境变量。
shell命令和流程控制
unix
概念
管道
重定向
backtick