Shell环境与变量
- Shell脚本就是把一批命令集合在一起,解决一些复杂的问题。有点类似于程序设计(在Shell中,变量、分支、循环、函数、数组等与程序设计完全类似的功能)。Shell的程序复杂度是无法真正与编程语言相提并论的,但是由于与操作系统是集成在一起的,所以能够执行一些更加底层的命令组合,且效率很高。
一、Shell基本用法
1. Shell的类型
命令 | 作用 |
---|---|
BourneShell (sh) | 是由AT&T Bell实验室的 Steven Bourne为AT&T的Unix开发的,它是Unix的默认Shell,也是其它Shell的开发基础。Bourne Shell在编程方面相当优秀,但在处理与用户的交互方面不如其它几种Shell。 |
BourneAgain Shell (bash) | 是自由软件基金会(GNU)开发的一个Shell,它是Linux系统中一个默认的Shell。Bash不但与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点。 |
CShell (csh) | 是加州伯克利大学的Bill Joy为BSD Unix开发的,共有52个内部命令,与sh不同,它的语法与C语言很相似。它提供了Bourne Shell所不能处理的用户交互特征,如命令补全、命令别名、历史命令替换等。但是,C Shell与BourneShell并不兼容。该Shell其实是指向/bin/tcsh这样的一个Shell,也就是说,csh其实就是tcsh。 |
KornShell (ksh) | 是AT&T Bell实验室的David Korn开发的,共有42 条内部命令,它集合了C Shell和Bourne Shell的优点,并且与Bourne Shell向下完全兼容。Korn Shell的效率很高,其命令交互界面和编程交互界面都很好。 |
2. Shell操作
命令 | 作用 |
---|---|
cat /etc/shells | 列出系统中所有的shell |
ksh /csh/zsh/bash | 切换到其他shell |
chsh feng | 使用命令chsh更改用户feng的默认shell |
cat /etc/passwd | 查看用户使用的默认Shell |
echo $SHELL | 查看当前环境$SHELL的值 |
3. Bash基本操作
命令 | 作用 |
---|---|
TAB键 | 命令补全功能 |
history命令或上下箭头 | 命令的历史记录‘ |
alias gohome="shutdown -h now" | 命令别名功能 |
crontab | 作业控制功能 |
shell脚本编程 | 非常灵活的脚本编程能力 |
ls;cat /etc/passwd;mount | 三个命令放在一起通过;分隔 |
4. echo命令
命令 | 作用 |
---|---|
echo "HelloWorld" | 在屏幕上输出HelloWorld |
echo -e "Hello\nWorld" | 使其支持转义符 |
\a | 蜂鸣 |
\b | 退格,覆盖前一个字符 |
\v | 不带换行符打印一行 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 制表符 |
\v | 纵向制表符 |
\ | 反斜杠 |
\0nnn | ASCII码是nnn(八进制)的字符 |
二、变量
1. 环境变量
- 环境变量是指当前操作系统预先定义好的一批全局变量,可以用于任意位置的引用。在Linux和Windows中,均有环境变量的概念,其中使用频率最高的环境变量是PATH,PATH中定义了一批文件夹/路径,表示只要是在这个目录下的命令,可以直接在命令行执行,不需要输入完整的路径
命令 | 作用 |
---|---|
set | 显示当前Shell的变量,包括当前用户的变量 |
env | 显示当前用户的变量 |
export | 显示当前导出成用户变量的Shell变量 |
cat /etc/profile | 全局的环境变量,对任何用户生效 |
cat ~/.bash_profile | 用户主目录下的环境变量,仅对当前用户生效(本地变量定义 在此) |
expoert NAME=Denny | 定义一个NAME环境变量并赋值为Denny |
expoert $NAME | 输出为一个环境变量的值 |
unset NAME | 删除环境变量 |
echo $USER | 当前登录的用户名 |
echo $UID | 当前登录的用户ID号 |
echo $SHELL | 当前用户的主目录 |
echo $HOME | 当前命令行所在的目录 |
echo $PWD | 当前命令行所在的目录 |
echo $PATH | 当前可执行的的路径(设定了PATH,执行命令就不用输入命令的绝对路径) |
echo $PS1 | 命令的他提示字符串(可以试一下export PS1="Welcome Linux# ") |
echo $PS2 | 命令一行未写完时换行提示符 |
2. 普通变量
命令 | 作用 |
---|---|
read NAME Bill Gates | 从终端将值读入并赋值给变量NAME |
echo $NAME | 将变量NAME的值输出 |
read NAME SURAME Bill GATES | 此时会将Bill赋值给NAME,而将GATES赋值给SURNAME |
cat -/.bsah_profile | 本地变量在此定义,将只对本用户生效 |
NAME=Dennny echo $NAME | 在命令行定义变量 |
SOURCE=/etc/passed DEST=/opt/learn cp SOURCE DEST | 利用变量代替对应值进行操作 |
NAME=Denny readonly NAME | 设置只读变量,此时变量的值将不能被修改 |
三、管道及重定向
命令 | 作用 |
---|---|
set | grep USER | 从set的输出中查找包括USER的行 |
ls | wc -l | 根据ls输出的行数来统计该文件夹下的文件数量 |
head /etc/passwd > passwd.txt | 将/etc/passwwd文件的输出重定向到文件passwd.txt中 |
tail /etc/passwd >> passwd.txt | 在文件passwd.txt后面追加 |
cat < /etc/passwd | 将/etc/passwd文件作为cat的输入 |
cat < /etc/passwd > passwd2.txt | 将/etc/passwd文件作为cat的输入,并将输出结果重定向到passwd2.txt中 |
ifconfig |tee ifconfig.tee | 将ifconfig的内容输出到屏幕上同时输出到文件ifconfig.tee中 |
ifconfig | tee -a ifconfig.tee | 一追加的方式输出到文件ifconfig.tee中 |
ifconfig 1> ifconfig.out | 标准输出重定向到文件ifconfig.out中 |
ifconfige 1> ifconfig.error | 将标准输出重定向到文件ifconfig.error中,此处应有语不存在命令ifconfige,所以ifconfig.error中没有内容 |
ifconfig 2>ifconfig.error | 标准错误重定向到文件ifconfig.error中,由于此处没有错误,所以ifconfig.error文件中没有内容 |
ifconfige 2> ifconfig.error | 标准错误重定向到文件ifconfig.error中 |
ls /opt /optt 2> cat.error | 将标准输出输出到屏幕而将标准错误重定向到cat.error |
ls /opt /optt 1> cat.error 2>&1 | 标准输出和标准错误一起重定向到一个文件 |
ls /opt /optt 2>ls.error 1> ls.out | 正确的输出和错误的输出分别重定向到不同的文件 |
ls /opt /optt 2> /dev/null | 标准错误信息会输送到系统垃圾箱,而不会输送到屏幕,也不会输出到任何地方 |
命令1 && 命令2 | 命令1成功执行后才执行命令2 |
命令1 || 命令2 | 命令1执行失败后才执行命令2 |
try | 查看当前终端设备号 |