3 linux命令行与shell脚本编程大全_part2
2017-12-22 本文已影响0人
brightsunp
6 开始shell编程
反引号:``将命令输出结果赋值给变量;
重定向:>写入文件,>>追加到文件,wc<test文件内容输入到命令;
管道:相当有用!同时运行,将命令的输出向后依次传递;
数学运算:记住bash仅能处理整数!
$[operation]
expr operation
bc # 设置scale以计算浮点数
var=`bc << EOF
scale=4
a1=10.46*43.67
b1=33.2*71
a1+b1
EOF
`
EOF用来标识内联重定向数据的开始和结尾;
退出脚本:exit [0~255]
7 逻辑流控制
双圆括号:((expression))高级数学表达式(C语言风格)
双方括号:[[expression]]匹配字符串
内部字段分隔符IFS:空格、制表符、换行符(包含空格的字符串,使用双引号)
while:允许多个测试命令,由最后的那个决定结束循环(所有命令都被执行,且每个命令都是单独一行)
break/continue n:跳出循环/停止循环内的命令,但继续外部循环(默认n=1)
# 普通shell命令:执行cmd,若exit 0,则执行cmds_1
if cmd
then
cmds_1
elif cmd
then
cmds_2
else
cmds_3
fi
# test命令:数值(-gt)。字符串(>或<,记得加双引号)、文件比较(包括目录、文件)
if [ $var1 -gt $var2 ]
if [ "$str1" \> "$str2" ] [ -n "$str1" ] [ -z "$str1" ]
if [ -d/-e "$HOME" ] [ -f/-s "$file" ]
# case命令
case variable in
pattern1 | pattern2)
cmds_1;;
pattern3)
cmds_2;;
*)
default_cmds;;
esac
# var保持最后一次迭代的值;按行遍历文件;结果重定向;结果管接给另一个命令
IFS=$'\n' IFS=: IFS=$'\n:;'"
for var in `cat "$file"`
do
echo $var
done > output.txt | sort
8 处理用户输入
# 读取程序名
`basename $0`
# 参数变量
$#; ${!#}; $*/$@
# 移除参数:用于遍历参数
while [ -n $1 ]; do ... shift n; done
# getopt命令:-a -b 'test1' -c -d --'test2''test3'
argv[]="-a -b test1 -cde test2 test3"
getopt -q ab:cd $@
9 shell基础
- 一切皆文件:所有资源统统抽象为文件形式
- 单一目的小程序:组合小程序完成复杂任务
- 尽量避免跟用户交互:易于编程实现自动化任务
- 使用文本文件保存配置信息
shell优势在于处理偏操作系统底层的业务,符合linux简单、易用、高效的三大原则;
python优势在于复杂运维软件、web页面管理工具、web业务的开发。
变量、注释
$+变量名,推荐引用时加上{}
需要原样输出,加上单引号
其他没有特别要求的字符串等最好都加上双引号
大段注释或临时代码加上{},定义成函数,不调用就不会执行。
myUrl="http://see.xidian.edu.cn/cpp/shell/"
readonly myUrl # 只读变量,更改会报错
myUrl="http://see.xidian.edu.cn/cpp/danpianji/"
unset myUrl # 删除变量,但不能删除只读变量
unset .f function # 删除函数
文件包含
source又称为点操作符,推荐使用.
被包含脚本不需要有执行权限。
# source ./function.sh或
. ./function.sh
# 获取绝对路径的方法
real_path=`readlink -f $filename`
. $real_path
10 shell高级
函数(库)
function func1 {
cmds
}
func2() {
cmds
}
# 局部变量
local temp
函数被重定义时,新定义覆盖原定义,不会产生任何错误消息。
$?函数的退出状态码,仅代表最后一条命令是否成功运行;return整数值,赋给$?为退出码;echo输出,赋给变量;循环+echo输出,赋给数组变量。
启动新shell自动加载函数:.bashrc文件
图形化菜单
function menu {
clear
echo -e "\t\t\tSys Admin Menu\n"
echo -e "\t1. Disply disk space"
echo -e "\t2. Display logged on users"
echo -e "\t3. Display memory usage"
echo -e "\t0. Exit program\n\n"
echo -en "\t\tEnter option: "
read -n 1 option
}
menu
case $option in
0)
break ;;
1)
diskspace ;;
2)
whoson ;;
3)
memusage ;;
*)
clear
echo "Sorry, wrong selection.";;
esac
11 正则表达式、sed进阶
[] 字符组:包含任何字符
[^] 排除字符组:之外的任何字符
[[::]] 特殊字符组:alnum=alpha+digit;blank/print/punct/space
*/+/? 0或多次/1或多次/0或1次
{m,n} 指定出现次数:在m到n的区间
|/() OR多个模式/聚合表达式
d 删除pattern space,进入下一个循环
h/H pattern space 复制/附加 hold space
g/G hold space 复制/附加 pattern space
x pattern space 交换 hold space
b/t 跳转(很难掌握)
& \1 \2 模式替代