【BUAA S3系统编程复习】Shell编程

本文详细介绍了Shell编程的基础知识,包括Bash环境、环境变量的设置、C语言获取环境变量、Shell脚本的使用、特殊符号、变量和表达式、参数拓展、条件控制、函数与数组以及Bash的调试方法。
摘要由CSDN通过智能技术生成

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 没有自带调试器或任何调试类型的命令或结构。脚本里的语法错误或拼写错误会产生含糊的错误信息,通常这些在调试非功能性的脚本时没有什么帮助

  • [ 条件 ]“条件”前后没有空格就会错

调试方法

  1. 大量使用echo语句显示程序内部执行情况

  2. 使用trap命令捕获程序退出的信号并执行相应的动作

    #! /bin/bash
    trap "echo a=$a, b=$b, c=$c" EXIT
    #该语句的意思是在程序退出时打印a,b,c变量
    
    • trap command signal 表示接收到signal信号后,执行command命令
  3. 使用sh命令的-n -x -v参数,如-n (notexe) 用于检测程序内部的语法错误(不会实际运行脚本)-x (exe) 用于打印每条命令的结果;-v (visible) 执行程序中的每条命令前**,显示该命令

Linux中有哪些种类的文件?

普通文件,管道文件,链接文件,目录文件,块文件

shell编程中有哪些特殊字符

| 管道字符, $ 取变量, # 注释,连接符 ;,输入输出重定向 > <,\ 转义符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值