3 linux命令行与shell脚本编程大全_part2

6 开始shell编程

反引号:``将命令输出结果赋值给变量;
重定向:>写入文件,>>追加到文件,wc 管道:相当有用!同时运行,将命令的输出向后依次传递;
数学运算:记住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 模式替代

你可能感兴趣的:(3 linux命令行与shell脚本编程大全_part2)