Linux bash shell环境变量以及语法规范

本文详细介绍了Linux bash shell的环境加载过程,包括Login Shell的配置文件读取流程和环境配置文件。讲解了bash的语法结构,如赋值语句、命令解析和字符串引用。此外,还探讨了变量操作,如export、unset、read、array和declare。同时,文章还涵盖了shell脚本编写中的条件判断、选择语句、循环和函数,以及环境变量的使用和设置。最后,列举了一些常见的环境变量及其作用,并指出了环境变量设置文件的位置和用途。
摘要由CSDN通过智能技术生成

bash环境加载

Login Shell读取配置文件流程


而非登录shell仅仅会读取 ~/.bashrc


bash的登录与欢迎信息

/etc/issue 文件: 记录了bash登录前的欢迎信息,相关信息可以用 man issue 查看

/etc/motd 文件: 记录了bash登录成功后的欢迎信息


bash的环境配置文件

 login shell: 在输入帐号密码登录的时候取得的bash,例如从tty1-tty6登录

non-login shell: 取得bash不需要完整的登录流程,例如在图形界面开启Terminal



语法结构规范

赋值语句 : var=value

变量解析 : ${var}

命令解析 : ${command}

双引号 " " : 变量内容,并做转义

单引号 ' ' : 变量内容,但不做转义 

反单引号 ` ` : 同 $()

End Of File  : "EOF"

复制代码
alexis@Smilodon:~$ version=v1.0
alexis@Smilodon:~$ echo $version
v1.0
alexis@Smilodon:~$ v2="$(uname) abc ${version}"
alexis@Smilodon:~$ echo $v2
Linux abc v1.0
alexis@Smilodon:~$ echo "$LANG"
en_US.UTF-8
alexis@Smilodon:~$ echo '$LANG'
$LANG
alexis@Smilodon:~$ echo `uname -r`
3.2.0-33-generic-pae
复制代码


Shell命令结构和规范

Shell作为外围软件生态群其中一个非常重要的组件。它是操作系统最外层的接口,负责直接面向用户交互并提供内核服务,包括命令行接口(CLI)或图形界面接口(GUI)两种形式。以CLI为例,它提供一套命令规范,是一种解释性语言,将用户输入经过解释器(interpreter)输出使其转化成真正的系统调用,实现人机交互的功能。

命令结构和规范
Thompson Shell命令语言结构和规范的基础,其解释器具有跨平台的可移植性,并影响到了后来包括Bourne Shell在内的各种脚本语言设计实现。Bourne Shell的5个特性和命令规范,可以通过sh(1)手册查看原始资料。

过滤器/管道线(filter/pipeline)。这绝对是要载入Unix史册的发明,创立者是Douglas McIlroy,Thompson Shell引入并实现了这个伟大的概念——一个或多个命令组成一根过滤器的链条,由’|'或’^'符号分隔。除最后一个命令之外,每个命令的标准输出都被作为下一个命令的标准输入。这样每个命令都作为一个独立的进程来运行,并通过管道与邻近的进程相连接。圆括弧内的命令序列整体上可以替代单个命令作为过滤器实现,比如用户可以输入”(A;B)|C”。

命令序列和后台进程。分号’;'指示多个命令序列化执行。’&’符号指示该命令在后台异步执行,使得前面的管道线不必等待其终止,仅仅报告一个进程id,这样用户以后可以通过kill命令与它通信。有益于进程管理。


I/O重定向。它利用了Unix设计上的一个重要特性——一切皆文件,用三个符号表示:”重定向输出,如果文件不存在则创建它,如果文件存在则截断它;’>>’追加模式重定向输出,如果文件不存在则创建它,如果文件存在则追加输出至末尾处。


通配符扩展(globbing)。通配符的概念源自于正则表达式,使得解释器智能地处理用户不完全输入,比如记不清文件名、一次性输入多个文件等。’?'匹配任意单一字符;’*'匹配任意字符串(包括空串);成对’['和']‘定义了字符集合一个类,可匹配方括号内任意成员,用’-'两端可指定一系列连续字符匹配范围。


参数传递。这里主要引入了位置参数和选项参数的概念:’$n’指示shell调用的第n个参数替代;还定义了两个选项参数’-t’和’-c’,前者用于交互,导致shell从标准输入中读入一行作为用户执行的系统命令,后者指示shell将附带的下一个参数作为命令执行(可正确处理换行符),是对’-t’的补充,特别是调用者已经读取了命令其中某些字符的情况下。如果不带选项参数则直接读取文件名。


注:

通配符(wildcard)

*:  代表任意个任意字符

?: 代表1个任意字符

[abc]: 代表a或b或c中的一个

[a-z]: 代表 a~z这个范围

[^abc] : 代表除了a或b或c以外的字符


数据流重定向:

0: STDIN 标准输入

1: STDOUT 标准输出

2: STDERR 标准错误输出

>, >>: 输出流重定向, > 为 覆盖,>> 为追加 

cat infile 1> outfile 2>&1

将 2 重定向到 1, 再将 1 重定向到 outfile 文件,意思是将标准错误输出和标准输出都存入outfile

find /home 2> /dev/null

将错误输出 /dev/null, /dev/null是垃圾黑洞,可以将信息忽略

< : 输入重定向

cat > catfile < ~/test

用 test 文件的内容代替STDIN输入到 catfile里

<<: eof符号

cat > catfile << 'eof'

你可以使用STDIN(键盘输入)来输入到catfile,当输入eof时,输入结束,相当于点了 ctrl + d


命令执行依据 ; && ||

; : 顺序执行

&& : 且 逻辑, cmdA && cmdB, 只有cmdA成功了才会继续执行cmdB,成功的依据就是 $? 这个状态回传码

|| : 或逻辑, cmdA || cmdB 只有cmdA执行失败才会继续执行cmdB

 

管道(pipe | )

管道可以将前一个命令的stdout当作后一个命令的stdin,只有特定的管道命令才能使用

管道命令有 cut,grep,sort,wc,uniq,tee,tr,col,join,paste,expand等

而ls cd这些命令则不是管道命令,如果需要使用管道则需要用xargs作参数代换


- 号的用途

- 号可以代替 STDOUT STDIN

tar -czv -f - /home | tar -xzv -f -

第一个 - 代替stdout,第二个 - 代替stdin,想当于用tar来实现cp


算数运算

$((a*b)) : 计算a与b的乘积,只支持整数 


变量操作

export与子进程:

如果需要在子进程(在一个shell中打开另一个shell)中使用父进程的变量,则需要使用export将自定义变量转为环境变量

复制代码
alexis@Smilodon:~$ name=alexis
alexis@Smilodon:~$ echo $name
alexis
alexis@Smilodon:~$ bash
alexis@Smilodon:~$ echo $name

alexis@Smilodon:~$ exit
alexis@Smilodon:~$ export name
alexis@Smilodon:~$ bash
ealexis@Smilodon:~$ echo $name
alexis
alexis@Smilodon:~$ exit
复制代码

unset: 取消变量

alexis@Smilodon:~$ name=liu
alexis@Smilodon:~$ echo $name
liu
alexis@Smilodon:~$ unset name
alexis@Smilodon:~$ echo $name


read, array, declare

read: 读取用户输入到某个变量

alexis@Smilodon:~$ read -p "Please enter your name: " name
Please enter your name: Alexis
alexis@Smilodon:~$ echo $name
Alexis

屏幕会输出 Please enter your name: 并等待用户输入,最后将输入赋值到name


array: bash数组的赋值与输出

复制代码
alexis@Smilodon:~$ arr[0]=1
alexis@Smilodon:~$ arr[1]=2
alexis@Smilodon:~$ arr[2]=3
alexis@Smilodon:~$ echo ${arr}
1
alexis@Smilodon:~$ echo ${arr[1]}
2
alexis@Smilodon:~$ 
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值