Shell编程
Shell基础
什么是shell?
- Shell是一个命令解释器,用来启动、停止、编写程序,解释用户在命令提示符下输入的指令
- Shell是用户和UNIX/Linux操作系统内核程序间的一个接口
Bash(GNU Bourne-Again Shell)
是一个为 GNU 计划编写的 Unix shell,它是许多 Linux 平台默认使用的 shell
用户
- 信息查看
- 用户信息可以在
/etc/passwd
中查看 - 每个用户必须属于一个用户组,用户组信息可以在
/etc/group/
中查看
- 用户信息可以在
环境变量
短期设置环境变量
export [环境变量名]=[值]
export system_programming=cool
永久设置环境变量
-
当前用户
修改
~/.bashrc
文件(.表示该文件是隐藏文件,要用ls -a才能看见)。
用gedit ~/.bashrc
打开~/.bashrc
文件,在末尾export
-
所有用户
将
export
语句写到/etc/profile
文件!注意:修改了profile文件后要用
source
重新加载
C语言程序获取环境变量
-
获取所有
extern char** environ; int main() { char **p = environ; for(; *p != NULL; p++) printf("%s\n", *p); }
-
获取指定
const char* envName = "envName"; printf("$envName=%s\n", **getenv**(envName));
path环境变量
- 是多个路径用
:
连接起来的
Shell编程基础
Shell脚本
#!/bin/bash
# ↑ 指明该脚本执行需要的命令解释器
# #!也可以被忽略,不过这样脚本无法使用 shell 内建的指令
#如果开头的shebang改为#! /bin/rm,则系统只会用rm来解释该文件,即文件一运行就会被删除
#如果开头的shebang改为#! /bin/more,则系统只会用more来解释该文件,即运行文件会将文件打印在终端上
LOG_DIR=/var/log
cd $LOG_DIR
cat /dev/null > messages
cat /dev/null > wtmp
echo "Logs cleaned up."
exit #退出Shell程序
退出
$?
读取最后执行命令的退出码- 退出码0表示成功,1-125用户可自定义具体含义
执行
./xxx.sh
得先添加可执行权限且在.sh头部写shebang(#!)bash xxx.sh
Shell脚本中的特殊符号
- 注释字符
#
- 如果前有 转义字符 \就不作为注释
- 单引号
‘’
- 括起来的字符均作为普通字符出现
- 双引号
“”
- 括起来的字符除
$
、\
、‘’
、和“”
之外都将作为普通字符对待
- 括起来的字符除
- 倒引号```
- 用于命令替换,其所括字符串在被Shell解释时,首先执行其中的命令并将其结果代替该命令
- 与
$()
作用相同
$* 和 $@ 的区别?
当 $* 和 $@ 不被双引号包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据,彼此之间以空格来分隔。
但是当它们被双引号包含时:
"$*"
会将所有的参数从整体上看做一份数据"$@"
仍然将每个参数都看作一份数据,彼此之间是独立的
Shell变量和表达式
- bash变量不分数据类型,依赖上下文
对比环境变量、用户定义变量和内部变量的异同点
请写出三个与系统工作环境相关的环境变量及其含义
- HOME 用于保持注册目录的完全路径名
- PATH shell按照该变量的顺序搜索与名称一致的可执行文件
- PWD 当前工作目录的绝对路径
内部变量
由系统提供,用户不能修改
用户自定义变量
- 定义时不加“$”不声明
- 统一认为是字符串,需要的时候进行类型转换
- 变量名由字母数字和下划线组成,并且变量名第一个字符不能为数字
- 采用
$变量名
或${变量名}
的方式使用
拓展
算数拓展
$((…)) #将需要计算的表达式包含在其中,用**计算结果替换**
expr 表达式 #计算并显示表达式的值
俩括号计算结果替换, 俩括号计算结果替换, 俩括号计算结果替换,单括号执行结果替代
参数拓展
如果 parameter 未定义或为 null | 否则 | |
---|---|---|
变量=${parameter:-word} | 用 word 置换变量的值(-弱) | 用 parameter 替换变量的值(不是+都一样,p行它就上) |
变量=${parameter:=word} | 用 word 置换 parameter 的值然后置换变量的值(=换两个) | 用 parameter 替换变量的值 |
变量=${parameter:?word} | word 被写至标准出错(显示word)然后退出 | 用 parameter 替换变量的值 |
变量=${parameter:+word} | 用 word 置换变量的值 | 不进行替换(有+无p) |
条件表达式
格式:
if [ $i -lt 10 ]; then
fi
test 表达式 或者直接使用 [表达式]判断条件表达式真假
字符串操作:
-z String 若String长度为0,表达式为真 zero
-n String 若String长度不为0,表达式为真 notzero
文件操作:
-d filename //若文件为目录,则为真
-f filename //若文件为普通文件,则为真
-r/w/x filename //若文件可读/可写/可执行,则为真
-s filename //当file文件长度大于0时,返回真
if/while后的()变成了[],if之后有fi
字符串操作 notcmp
长度
echo ${#stringZ} #string前不是$而是#
echo `expr length $stringZ`
echo `expr "$stringZ" : '.*'`
输出正则表达式匹配的子串的长度
# 其中substring是一个正则表达式
expr match "$string" "$substring"
expr "$string" : "$substring"
正则
. 一个**除换行符**之外的其他任意字符
* 前一个字符匹配0次或多次
{3} 表示前一个字符应当重复3次
| 或运算
\ 转义符
如:
'^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$'
可以匹配 (xxx) xxx-xxxx 或 xxx-xxx-xxxx 的字符串
Shell脚本控制流程
条件控制
if [ 表达式1 ]; then
命令列表1;
elif [ 表达式2 ]; then
命令列表2;
else [ 表达式3 ]; then
命令列表3;
fi
case 变量 in
表达式1)
命令列表1;
;;
表达式2)
命令列表2;
;;
)
默认命令列表;
;;
esac
循环控制
until [ 条件表达式 ];do
命令列表;
done
while [ 表达式 ];do
命令列表;
done
for name in [参数列表];do
命令列表;
done
#最后都有done
Shell脚本函数和数组
函数
[ function ] name (){函数体} [ 重定向 ]
- shell程序是按行执行的,所以shell函数必须在使用前定义
- $0指的是函数名
返回值
- 紧接着函数调用(之间不能有其它语句),通过
$?
命令可访问函数返回值
function max()
{
blabla……
}
max 1 2 3
echo “the max number of 1 2 3 is : $?”
数组
- 下标从0开始,数组定义后大小没有限制,且其数据可以不连续,一部分成员允许不被初始化
# 定义与赋值
array[index]=value #将array数组的index位置赋值为value
array=(jerry tom alice keven julie) **注意是小括号括起来,分隔符是空格!!**
array=([xx]=XXX [yy]=YYY ...)
declare -a array #通过declare命令声明数组array
# 访问
${array[index]}
#如果index是*或@,则意思是取数组的所有元素
Bash调试
-
Bash shell 没有自带调试器或任何调试类型的命令或结构。脚本里的语法错误或拼写错误会产生含糊的错误信息,通常这些在调试非功能性的脚本时没有什么帮助
-
[ 条件 ]
“条件”前后没有空格就会错
调试方法
-
大量使用
echo
语句显示程序内部执行情况 -
使用
trap
命令捕获程序退出的信号并执行相应的动作#! /bin/bash trap "echo a=$a, b=$b, c=$c" EXIT #该语句的意思是在程序退出时打印a,b,c变量
trap command signal
表示接收到signal信号后,执行command命令
-
使用
sh
命令的-n -x -v参数,如-n
(notexe) 用于检测程序内部的语法错误(不会实际运行脚本);-x
(exe) 用于打印每条命令的结果;-v
(visible) 在执行程序中的每条命令前**,显示该命令。
Linux中有哪些种类的文件?
普通文件,管道文件,链接文件,目录文件,块文件
shell编程中有哪些特殊字符
| 管道字符, $ 取变量, # 注释,连接符 ;,输入输出重定向 > <,\ 转义符