linux脚本编程基础

本篇为linux脚本编程基础。

目录

一、bash

1.1 bash

1.2 source命令和./命令

二、文本流及重定向

2.1文本流

2.2 重定向

三、shell变量

四、引用

五、算术表达式

六、添加用户脚本(练习)

七、流程控制

一、bash

1.1 bash

bash是一个解释器,可以从1)用户交互输入2)文本文件输入中执行命令。在命令行输入bash命令时会创建一个bash子进程,再次输入命令时会在这个bash子进程中执行命令。如下图所示:

linux脚本编程基础_第1张图片

1.2 source命令和./命令

有如下sh01.sh文件:

linux脚本编程基础_第2张图片

source命令:从当前bash(shell)执行文件中的命令。

source sh01.sh   

执行后打印的进程号为当前bash的进程号。

./命令:从当前bash(shell)中创建子bash执行文件中的命令。

执行以下命令:

chmod +x sh01.sh    #转换为可执行文件
./sh01.sh           #用./命令执行

./命令读取到sh01.sh的第一行时会按/bin/bash启动子bash,然后用子bash执行sh01.sh中的命令,执行完返回父bash。

注意:若没有第一行#!/bin/bash,./命令也会启动默认bash执行文件中的命令。

二、文本流及重定向

2.1文本流

程序自身都有I/O    0:标准输入1:标准输出2:错误输出

/proc/$$/fd    #该目录下为输入输出端。

linux脚本编程基础_第3张图片

2.2 重定向

输出重定向

ls / /temp 1>bbb          #将/和/temp下的内容通过标准输出重定向到bbb文件中,该方式会覆盖bbb中的
                            内容,输出顺序按目录树深度输出,同级目录按字典序输出
ls / /temp 1>>bbb         #将/和/temp下的内容通过标准输出追加重定向到bbb文件中,该方式将输出追
                            加到bbb文件中
ls /aabb 2>ccc            #将错误输出到ccc文件中(没有/aabb这个文件)
ls / /aabb 1>ls01.out 2>ls02.out   #将标准输出和错误输出分别输出到不同文件中
ls / /aabb 1>ls03.out 2>ls03.out   #执行覆盖重定向后ls03.out中的内容为标准输出!因为会先输出错误
                                      信息,然后输出正确信息
ls / /aabb 1>>ls04.out 2>>ls04.out #执行追加重定向后ls04.out中的内容前面为错误输出,后面为标准输
                                     出
ls / /aabb 1>ls06.out 2>&1         #标准输出到文件,错误输出重定向到标准输出。两边都是文件描述符
                                     的时候用>&符号
ls / /aabb 2>&1 1>ls06.out         #执行结果:控制台输出错误信息,ls06.out中为ls /命令的正确信
                                     息。解释:ls / /aabb执行后得到错误信息1,正确信息2。2>&1后
                                     错误信息输出到控制台,1>ls06.out后正确信息输出到文件中。
ls / /aabb >& ls07.out             #标准输出和错误输出重定向到ls07.out。特殊写法。相当于2>&1 
                                     1>ls07.out,连续执行。
>& &>                     #作用相同,相当于错误重定向到标准输出,左边省略2和右边省略1

输入重定向

linux脚本编程基础_第4张图片

cat 0

使用输入输出访问百度

linux脚本编程基础_第5张图片

三、shell变量

函数变量

linux脚本编程基础_第6张图片

数组变量

linux脚本编程基础_第7张图片

特殊变量

linux脚本编程基础_第8张图片

管道

linux脚本编程基础_第9张图片

其中,创建的子bash可以继承父bash的变量值。

$$和$BASHPID

linux脚本编程基础_第10张图片

四、引用

双引号:弱引用,参数扩展

单引号:强引用,不可嵌套

linux脚本编程基础_第11张图片

五、算术表达式

算术表达式

let  算术运算表达式

      •let  C=$A+$B

$[算术表达式]

      •C =$[$A+$B]

$((算术表达式))

      •C=$(($A+$B))

expr  算术表达式 

      •注意:表达式中各操作数及运算符之间要有空格。而且要使用命令引用

      •C=`expr $A + $B`

linux脚本编程基础_第12张图片

条件表达式

test命令

linux脚本编程基础_第13张图片

[]命令

linux脚本编程基础_第14张图片

六、添加用户脚本(练习)

目标如下:

linux脚本编程基础_第15张图片

代码如下,运行时“./adduser.sh dxw”

#! /bin/bash
# 判断输入参数,如果参数为1个,$# -eq 1 为true取反为false,后面不会执行
[ ! $# -eq 1 ] && echo "args error!!!" && exit 2
# 判断用户是否已存在。id $1输出到“黑洞”中。
id $1 >&/dev/null && echo "user exist" && exit 3
# 添加用户。id $1输出信息到“黑洞”中不显示;使用管道设置密码。
useradd $1 >&/dev/null && echo $1 | passwd --stdin $1 >&/dev/null && echo "user add success" && exit 4
# 如果上面没有正确退出,则输出错误提示。
echo "i don't know ,user add fail" && exit 5

七、流程控制

if命令

while命令

for命令

linux脚本编程基础_第16张图片

练习

linux脚本编程基础_第17张图片

代码如下:

#! /bin/bash
oldIFS=$IFS               #默认分隔符为空格、制表符、换行符。在此替换为换行符分割。
IFS=$'\n'
for i in `du -a $1 | sort -nr`;do      #按大小逆序排列目录中的文件
	filename=`echo $i | awk '{print $2}'`    #获取文件名
	if [ -f $filename ];then                 #如果为文件,输出
		echo $filename
		break
	fi
done 
IFS=$oldIFS              #将分隔符换为默认的

 

 

你可能感兴趣的:(linux脚本编程基础)