什么是shell
shell是一个作为用户与Linux系统间接口的程序,它允许用户向操作系统输入需要执行的命令
使用<和>对输入输出进行重定向
使用|在同时执行的程序间实现数据的管道传递
使用$获取子进程的输出
/bin/bash --version // 查看bash的版本信息
管道和重定向
重定向输出
ls -l > isoutput.txt #把ls命令的输出保存到文件isoutput.txt中,文件不存在则创建,存在则覆盖 cat isoutput.txt
文件描述符
0代表程序的标准输入
1表示标准输出
2表示标准错误输出
追加重定向
>> 将输出追加到指定文件的尾部
(base) asgter@asgter-TM1613:~/Linux/C/funclib$ ps >> isoutput.txt (base) asgter@asgter-TM1613:~/Linux/C/funclib$ tail isoutput.txt -rw-rw-r-- 1 asgter asgter 1528 8月 25 00:59 fred.o -rw-rw-r-- 1 asgter asgter 0 8月 25 01:57 isoutput.txt -rw-rw-r-- 1 asgter asgter 3266 8月 25 01:11 libfoo.a -rw-rw-r-- 1 asgter asgter 112 8月 25 01:02 lib.h -rwxrwxr-x 1 asgter asgter 8720 8月 25 01:14 program -rw-rw-r-- 1 asgter asgter 93 8月 25 01:07 program.c -rw-rw-r-- 1 asgter asgter 1568 8月 25 01:14 program.o PID TTY TIME CMD 5189 pts/1 00:00:00 bash 7631 pts/1 00:00:00 ps
标准错误输出重定向
ls -l 2> isoutput.txt
kill -HUP 1234 >killout.txt 2>killerr.tx
kill -1 1234 >killouterr.txt 2>&1
# 将标准输入重定向到文件killouterr.txt,将标准错误输出重定向到与标准输出相同的地方
kill -1 1234 >killouterr.txt 2
Linux回收站
/dev/null
管道
ps | sort > pssort.out
ps | sort | more
ps -xo comm | sort | uniq | grep -vsh | more # 首先按字母的顺序排序ps命令的输出 # 再用uniq命令去除名字相同的进程 # 然后用grep -v sh命令删除名为sh的进程 -v就是反转,就是不查找带sh的字符串 # 最终将结果分页显示在屏幕上
Shell简单的脚本
grep -l 列出文件内容符合指定的范本样式的文件名称。 这个命令会去深入的查文件内容, 不是文件名.
(base) asgter@asgter-TM1613:~/Linux/C/funclib$ for file in * > do > if grep -l POSIX $file > then > more $file > fi > done
shell通配符扩展
* 匹配一个字符串
? 匹配单个字符
[set]允许匹配方括号中的任何一个单字符
[^set]对方括号的内容取反
{finger, toe}允许将任意的字符串组放在一个集合中,匹配成功任意一个就行
shell的语法
变量
变量通常不需要事先声明
在默认情况下, 所有变量都被看作字符串并以字符串来存储
Linux区分大小写, 变量foo与Foo是不同的
可以在变量名前加$符号来访问变量的内容
(base) asgter@asgter-TM1613:~$ salutation=Hello (base) asgter@asgter-TM1613:~$ echo salutation salutation (base) asgter@asgter-TM1613:~$ salutation="Yes: > " (base) asgter@asgter-TM1613:~$ echo $salutation Yes: (base) asgter@asgter-TM1613:~$ echo salutation salutation (base) asgter@asgter-TM1613:~$ salutation=7+5 (base) asgter@asgter-TM1613:~$ echo salutation salutation (base) asgter@asgter-TM1613:~$ echo $salutation 7+5 (base) asgter@asgter-TM1613:~$ read salutation what's up? (base) asgter@asgter-TM1613:~$ echo salutation salutation (base) asgter@asgter-TM1613:~$ echo $salutation what's up?
使用引号
一般情况下, 脚本文件中的参数以空白字符分隔(空格,制表符,换行符)
如果想在一个参数中包含一个或多个空白字符, 必须给参数加上引号
双引号等同于不加双引号
单引号等同于将$转义
(base) asgter@asgter-TM1613:~$ myvar="Hi threr" (base) asgter@asgter-TM1613:~$ echo $ myvar $ myvar (base) asgter@asgter-TM1613:~$ echo "$myvar" Hi threr (base) asgter@asgter-TM1613:~$ echo $myvar Hi threr (base) asgter@asgter-TM1613:~$ echo '$myvar' $myvar (base) asgter@asgter-TM1613:~$ echo $myvar $myvar (base) asgter@asgter-TM1613:~$ (base) asgter@asgter-TM1613:~$ echo "Hello here" Hello here (base) asgter@asgter-TM1613:~$ read myvar Hello friend (base) asgter@asgter-TM1613:~$ echo '$myvar' now equals $myvar $myvar now equals Hello friend
环境变量
$HOME 当前用户的家目录
$PATH 以冒号分隔的用来搜索命令的目录列表
$0 shell脚本的名称
$# 传递给脚本的参数个数
$$ shell脚本的进程号,脚本程序通常会用它来生成一个唯一的临时文件,如 /tmp/tmpfile.$$
参数变量
$1, $2, ... 脚本程序的参数
$* 在一个变量中列出所有的参数,各个参数之间用环境变量IFS中的第一个字符分隔符
$@ $*的变体, 用法大致相同
(base) asgter@asgter-TM1613:~$ IFS="" (base) asgter@asgter-TM1613:~$ set foo bar bam (base) asgter@asgter-TM1613:~$ echo $@ foo bar bam (base) asgter@asgter-TM1613:~$ echo $* foo bar bam (base) asgter@asgter-TM1613:~$ echo "$*" foobarbam (base) asgter@asgter-TM1613:~$ unset IFS (base) asgter@asgter-TM1613:~$ echo "$*" foo bar bam
#!/bin/bash salutation="Hello" echo $salutation echo "The program $0 is now running" echo "The second parameter was $2" echo "The first parameter was $1" echo "The parameter list was $*" echo "The user's home directory is $HOME" echo "Please enter a new greeting" read salutation echo $salutation echo "The script is now complete" exit 0