Linux下shell编程

匿名 (未验证) 提交于 2019-12-02 21:56:30

什么是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.txtkill -HUP 1234 >killout.txt 2>killerr.txkill -1 1234 >killouterr.txt 2>&1  # 将标准输入重定向到文件killouterr.txt,将标准错误输出重定向到与标准输出相同的地方kill -1 1234 >killouterr.txt 2

Linux回收站

/dev/null

管道

ps | sort > pssort.outps | 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 当前用户的家目录

参数变量

$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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!