bash shell脚本常用功能
来源:互联网 发布:数据透视表不显示总计 编辑:程序博客网 时间:2024/05/03 04:54
转自:http://blog.sina.com.cn/s/blog_803458bd0101egd3.html
目录:
第一章 简介第二章 终端打印
第三章 变量和环境变量
第四章 通过shell进行数学运算
第五章 玩转文件描述符和重定向
tee命令 一方面将数据重定向到文件,另一方面还可以提供一份重定向数据副本作为后续命令的stdin
1,将文件重定向到命令
2,重定向脚本内部的文本块
3,自定义文件描述符
第六章 数组和关联数组
第七章 使用别名
第八章 获取终端信息
第九章 获取,设置日期和延时
第十章 调试脚本
第十一章 函数和参数
第十二章 读取命令序列输出
第十三章 以不按回车键的方式读取字符 "n"
第十四章
第十五章 比较与测试
第一章 简介
$ 表示普通用户
# 表示超级用户
#!/bin/bash
#! 称作 shebang 在unix里面,用sharp或者hash称#
/bin/bash 是Bash的路径
当打开一个终端时,该终端最初会执行一组命令来定义诸如提示文本,颜色等各种设置。这组命令来自位于用户home目录的.bashrc脚本文件中(~/.bashrc)
bash还维护了一个历史记录文件~/.bash_history 用于保存运行过得命令
~ 是一种简写,代表用户home目录的路径。
第二章 终端打印
1,echo输出
参数 -n 忽略换行
如果输出没有特殊字符的字符串,三种方式都没有问题
echo hello world
echo 'hello world'
echo "hello world"
如果有特殊字符的输出,使用单引号,单引号会把引号里面的任何字符转义成普通字符,再输出。即单引号里面的任何字符的特殊含义都会被屏蔽
echo 'hello world !'
echo的彩色文本输出
重置:0
y$ echo -e "\e[1;31m this is red text \e[0m"
\e[0m 作用是把后面的颜色重置为原来颜色
echo设置彩色背景输出
重置:0
y$ echo -e "\e[1;41m this is red text \e[0m"
2, printf输出
printf可以指定字符串的宽度,左右对齐方式。默认printf不会自动换行,需要添加\n
%s %c %d %f是格式替代符(format substitution character)
%-5s 指定一个格式为左对齐宽度为5的字符串替代,左对齐,如果字符串不够则用空格替代。
#!/bin/bash
printf "%-5s %-10s %-4s\n" No Name Mark
printf "%-5s %-10s %-4.2f\n" 1 Sarath 80.3456
printf "%-5s %-10s %-4.2f\n" 2 James 90.9989
printf "%-5s %-10s %-4.2f\n" 3 Jeff 77.564
输出:
No
1
2
3
第三章 变量和环境变量
env 命令查看与此终端进程相关的环境变量
对于每个进程,其运行时的环境变量用如下查看 cat /proc/$PID/environ
例如,debug.sh脚本在运行,可以通过下面的方式获取该进程的ID
pgrep debug.sh
列出的环境变量都是以name=value的形式表示,彼此用null字符(\0)分割
这里用换行替换\0
cat /proc/26574/environ | tr '\0' '\n'
1.3.2 实战演练
var=value
var = value 是相等操作
环境变量是从父进程继承而来的变量。例如 HTTP_PROXY
HTTP_PROXY=http://192.168.0.2:3128
export HTTP_PROXY
export命令用来设置环境变量,
环境变量PATH
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
给PATH添加新路径,有如下方法1
$ export PATH="$PATH:/home/user/bin"
~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/user/bin
方法2
PATH="$PATH:/home/user/bin"
export PATH
还有一些环境变量 HOME PWD USER UID
1.3.3 有关普通变量和环境变量的补充内容
1 获取字符串长度
2 识别当前的shell版本
3 检查是否为超级用户
4 修改bash提示字符串(username@hostname:~$)
* 列出PS1
cocktail@COCKTAILL7:~$ cat ~/.bashrc | grep PS1
[ -z "$PS1" ] && return
* 设置PS1
cocktail@COCKTAILL7:~$ PS1="MAINTENANCE>>"
MAINTENANCE>>
* 设置颜色
第四章 通过shell进行数学运算
bash shell环境中,可以利用let, (())和[]执行基本的算术操作符。
expr和bc可以用于高级算术操作。
#!/bin/bash
no1=5
no2=5
#let
let result=no1+no2
echo $result
let no1++
echo "no1++ $no1"
let no2--
echo "no2-- $no2"
let ++no1
echo "++no1 $no1"
let --no2
echo "--no2 $no2"
let result=no1+no2
echo $result
#[]
result1=$[ no1 + no2 ]
echo $result1
#[]
result2=$[ $no1 +5 ]
echo $result2
#(())
result3=$(( no1 +45 ))
echo $result3
#expr
result=`expr 3 + 4`
result=$(expr $no1 + 5)
#bc
echo "4 * 0.56" | bc
no=54
result5=`echo "$no * 1.5" | bc`
echo $result
#bc scale
echo "scale=3;3/8" | bc
#bc obase ibase
no=100
echo "obase=2;$no" | bc
no=1100110
echo "obase=10;ibase=2;$no" | bc
#bc sqrt 计算平分和平分根
echo "sqrt(100)" | bc
echo "10^10" | bc
第五章 玩转文件描述符和重定向
> 等同于 1>
命令执行成功与否的情况
当一个命令发生错误并退回时,它会返回一个非0的退出状态,而当命令成功完成之后,它会返回数字0.
退出状态可以从特殊变量 $? 中获得(在命令执行语句之后运行echo $? ,就可以打印出退出状态)
标准错误和标准输出分别输出到不同文件
将标准错误和标准输出一起输出到同一文件
或者
/dev/null 是一个特殊设备文件,这个文件接收到任何数据都会被丢弃,因此null设备通常也被称为位桶(bit bucket)或者黑洞
some_command 2> /dev/null
tee命令 一方面将数据重定向到文件,另一方面还可以提供一份重定向数据副本作为后续命令的stdin
command | tee file1 file2
cat debug* | tee out.txt | cat -n
tee命令的-a参数,可以设置追加文本
cat debug* | tee -a out.txt | cat -n
我们可以使用stdin作为命令参数,只需要将-作为命令的文件名参数即可,例如
echo who is this | tee -
或者将/dev/stdin作为输出文件名来使用stdin
类似地,使用/dev/stderr代表标准错误,/dev/stdout代表标准输出。
1.5.3补充内容
1,将文件重定向到命令
cmd < file
2,重定向脚本内部的文本块
在cat <<EOF>log.txt与下一个EOF之间的所有文本都会当做stdin, 输出到log.txt中
#!/bin/bash
cat <<EOF>log.txt
LOG file header
this is a test log file
function system statistics
EOF
3,自定义文件描述符
文件描述符是用于访问文件的一种抽象指针,
我们可以使用exec命令创建自定义的文件描述符,
文件打开模式,通常有三种模式,
* 只读模式
* 截断模式
* 追加模式
< 操作符用于从文件中读取到stdin
> 操作符用于截断模式的文件写入(数据在目标文件内容被截断之后写入)
>> 操作符用于追加模式的文件写入(数据被添加到文件的现有内容中,而且该目标文件中原有的内容不会丢失)
文件描述符可以用以上三种模式中的任意一种来创建,例如
为读取文件创建一个文件描述符
** 分配文件描述符3 给input.txt 用于从文件中读取信息。
maintenance>PS1="maintenance> "
maintenance> echo this is a test line > input.txt
maintenance> exec 3maintenance> cat <&3
this is a test line
** 创建文件描述符用于写入到文件中(截断模式)
maintenance> exec 4>output.txt
You have new mail in /var/mail/cocktail
maintenance> echo newline >&4
maintenance> cat output.txt
newline
这两种方式都把文本写入到了output.txt文件中。区别在哪??????
maintenance> echo xxxoo > output.txt
maintenance> cat output.txt
xxxoo
** 创建文件描述符用于追加写入 (追加模式)
maintenance> exec 5>>input.txt
maintenance> echo appended line >&5
maintenance> cat input.txt
this is a test line
appended line
每次创建文件描述符,使用之后,需要用exec再重新创建
第六章 数组和关联数组
bash支持普通数组和关联数组
普通数组:只能用整数作为数组索引
关联数组:可以使用字符串作为数组索引
普通数组
关联数组
第七章 使用别名
别名可以使用函数实现,或者alias命令实现
例如
alias命令 的作用是暂时的,一旦关闭当前终端,设置的别名就失效了,
为了使别名一直保持效果,可以放入~/.bashrc文件中
echo 'alias install="sudo apt-get install"' >> ~/.bashrc
删除别名
另一种创建别名的方法时定义个函数,放入~/.bashrc
例如,创建一个别名rm,它能删除原始文件,并在backup目录中保存副本
alias rm='cp $@ ~/backup; rm $@'
1.7.3 补充
字符 \ 对命令实施转义,使我们可以执行原本的命令,而不是这些命令的别名替身。在不信任的环境下执行特权命令,通过在命令前加上 \ 来忽略可能存在的别名设置总是一个不错的安全实践,因为攻击者可能已经利用别名将某些特权命令替换成一些别有用心的命令,借此盗取用户输入的重要信息!
第八章 获取终端信息