Linux下shell编程

什么是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

 

posted @ 2019-08-28 00:22  draven123  阅读(197)  评论(0编辑  收藏  举报