Linux Shell Script
理解 bashrc 和 profile
在一般的 linux 或者 unix 系统中, 都可以通过编辑 bashrc 和 profile 来设置用户的工作环境, 很多文章对于 profile 和 bashrc 也都有使用, 但究竟每个文件都有什么作用和该如何使用呢?
首先我们来看系统中的这些文件, 一般的系统可能会有。
num | file |
---|---|
1 | /etc/profile |
2 | /etc/bashrc |
3 | ~/.bashrc |
4 | ~/.profile |
而如果/etc/bashrc
而会有 /etc/bash.bashrc
文件.
以上这些就是常用 profile 和 bashrc 文件了. 要理解这些文件之前还需要了解 Shell, Shell 的 login(登入) 和 interactive(交互式) 模式.
Shell 的模式
Shell 的分类
系统的 shell 有很多种, 比如 bash, sh, zsh 之类的, 如果要查看某一个用户使用的是什么 shell 可以通过 finger [USERNAME]
命令来查看. 我们这里只说 shell 是 bash 的情况, 因为如果是 sh 或者其他 shell 显然不会运行 bashrc 的.
login shell 和 no-login shell
login shell
su -
命令, 或者用 ssh 连接到某一个服务器上,
/etc/profile
和 ~/.profile
文件, 但不会执行任何的 bashrc
文件, 所以一般再 /etc/profile
或者 ~/.profile 里我们会手动去 source .bashrc
文件.
no-login shell
bash
或者 bash -c “CMD”
来启动的 shell.
该模式下是不会自动去运行任何的 profile 文件.
interactive shell 和 non-interactive shell
interactive shell
non-interactive shell
bash -c “CMD”
来执行的bash.
各种模式下 RC 文件的执行
ssh sudo su 或者 mac 下开启终端
ssh
登入和 su -
是典型的 interactive login shell, 所以会有 PS1
变量, 并且会执行
1 | /etc/profile |
1 | /etc/bash.bashrc |
bash -c cmd 或者 bash BASHFILE 命令执行的 shell
这些命令什么都不会执行, 也就是设置 PS1
变量, 不执行任何 RC 文件
ssh server [cmd]
这是最特殊的一种模式, 理论上应该既是 非交互 也是 非登入的, 但是实际上他不会设置 PS1, 但是还会执行
1 | /etc/bash.bashrc |
这里还有一点值得注意的是 /etc/bashrc
任何情况下都不会执行.
bashrc 和 profile 的区别
看了之前那么多种状态组合, 最关键的问题是, 究竟 bashrc 和 profile 有什么区别呢?
profile
其实看名字就能了解大概了,
bashrc
bashrc 也是看名字就知道, 是
期望的执行顺序
=> 代表 在文件内部 source, 换行的 => 代表自身执行结束以后在 source, 同一行表示先 source 在执行自身
普通 login shell
/etc/profile
=> /etc/bash.bashrc
~/.profile
=> ~/.bashrc => /etc/bashrc
终端种直接运行 bash
/etc/bash.bashrc
~/.bashrc => /etc/bashrc
bash -c “CMD”
什么都不执行
ssh server “CMD”
/etc/bash.bashrc => /etc/profile
~/.bashrc => | /etc/bashrc => /etc/profile
| ~/.profile
这里会有点小混乱, 因为既有 /etc/bash.bashrc 又有 /etc/bashrc, 其实是这样的 ubuntu 和 debian 有 /etc/bash.bashrc 文件但是没有 /etc/bashrc, 其他的系统基本都是只有 /etc/bashrc 没有 /etc/bash.bashrc.
原文
parameters
$# → the number of parameters(function or script)
$? → the return code
$1 → the first parameter
$0 → in function,all parameter; in script, this is the path of script
$$ → current process id
$* 表示所有参数组成的一个字符串,在上面的例子中,为param1 param2 param3。这些参数之间的间隔是IFS的首个字母即空格,IFS包括TAB,空格,换行等字符。
$@ 等同于”$1” “$2”… “$N”。
$varname == ${varname}
语句
if
注意事项
- if与[之间
要有空格 - []与判断条件之间也
必须有空格 - ]与;之间
不能有空格
二. 对字符串的判断
- 当两个字符串相同时返回真
1
if [ str1=str2 ]; then fi
- 当两个字符串不相等时返回真
1
if [ str1!=str2 ]; then fi
- 当字符串的长度大于0时返回真(判断变量是否有值)
1
if [ -n str1 ]; then fi
- 当字符串的长度为0时返回真
1
if [ -z str1 ]; then fi
三. 对数字的判断
int1 -eq int2
int1和int2相等 int1 -ne int2
int1不相等int2 int1 -gt int2
int1大于int2 int1 -ge int2
int1大于等于int2 int1 -lt int2
int1小于int2 int1 -le int2
int1小于等于int2
四. 对文件属性的判断
1 | # 1. 文件可读为真 |
五. 逻辑判断
-a
与 -o
或 !
非
while
1 | while [ condition ] |
for
1 | for i in *.mp4; do |
about string
1 | :~$ echo "abcd" | tr a-z A-Z #lower case of word |
output color message
Black 0;30 Dark Gray 1;30
Blue 0;34 Light Blue 1;34
Green 0;32 Light Green 1;32
Cyan 0;36 Light Cyan 1;36
Red 0;31 Light Red 1;31
Purple 0;35 Light Purple 1;35
Brown/Orange 0;33 Yellow 1;33
Light Gray 0;37 White 1;37
1 |
|
脚本的自动化交互输入
1.重定向
这个方法很简单,把需要输入的内容按每行写入到文档中,然后运行脚本
1 | :~$ ./vpncmd < content |
2.使用管道
1 | :~$ echo -e "3\n" | ./vpncmd |
3.expect
expect是专门用来交互自动化的工具,但它有可能不是随系统就安装好的,有时需要自己手工安装该命令
1 | :~$ apt-get install expect |
spawn [command]: 指定需要哪个命令需要自动化expect [message]: 需要等待的消息send [message]: 是要发送的命令。此message需要加上\r
或\n
以表示回车expect off: 指明命令交互结束
方式一
1 |
|
1 |
|
方式二
1 | :~$ echo ' |
File
1 | sed -i "s/abcd/aaaa/" /tmp/bb # replace "abcd" with "aaaa" in file |
重定位
0
–标准输入1
–标准输出2
–标准错误信息输出>&
–将所有输入重定位
1 | :~# ls 1>/dev/null |
Get Current User Name
You can use the variables
$USER - Current user name.
1 | devin:~$ echo "$USER" |
id command - Current user name.
1 | devin:~$ id -u -n |
whoami command
1 | devin:~$ whoami |
logname command
1 | devin:~$ logname |