Shell 图形化和命令行两种,一个用户一旦登录就默认打开 /bin/bash
查看/etc/passwd最后一列就是用户打开的那个程序,/bin/bash 或者 nolgin
Linux pstree命令将所有行程以树状图显示,树状图将会以 pid (如果有指定) 或是以 init 为根
1.2 bash
Bash 是一个与 sh 兼容的命令解释程序,可以执行从标准输入或者文件中读取的命令(解释器),是许多Linux发行版的默认Shell(启动器).
通俗地讲,用命令行和linux交换的界面就是一个bash(可能不太准确哦),有解释器和启动器的功能.
(1) source 命令 和 . 命令+文件
从当前bash执行命令或者脚本
(2) bash命令 或者文件自己执行(./文件)
从子bash执行命令(重新打开一个bash)
bash -x 文件 ,可以查看程序执行过程(debug)
bash -n 文件,检查是否有语法错误
下面的test1中写的为echo $$和pstree
一个 Linux 进程启动后,会在内核空间中创建一个 PCB 控制块,PCB 内部有一个文件描述符表(File descriptor table),记录着当前进程所有可用的文件描述符,也即当前进程所有打开的文件。
文件描述符 | 文件名 | 类型 | 硬件 |
---|---|---|---|
0 | stdin | 标准输入文件 | 键盘 |
1 | stdout | 标准输出文件 | 显示器 |
2 | stderr | 标准错误输出文件 | 显示器 |
0,1,2比较特殊,代表着标准输入(键盘),标准输出(显示器)和错误输出(显示器)。一般指向于当前shell的终端,(包含输入输出设备).如果是本机的话是tty,ssh链接的话,指向的是ptsx(虚拟终端,x为数字,一般从0开始).他们都指向于dev下的设备文件.谁让linux中一切皆文件呢.
下图为ssh登录
下图为本地登录
下面是每个进程的fd指向于文件表,但是实际的文件在节点表中,如果重定向就是把fd到文件表的指针指向其他地方.
补充: 同一个进程的不同文件描述符可以指向同一个文件;
不同进程可以拥有相同的文件描述符;
不同进程的同一个文件描述符可以指向不同的文件(一般也是这样,除了 0、1、2 这三个特殊的文件);
不同进程的不同文件描述符也可以指向同一个文件
重定向不是命令
示例 /目录下不存在/abb目录下面是各种输出重定向
ls / 1>1.out : 把根目录下的list信息输出到1.out文件中
ls /abb 2>2.out:把错误信息重定向到2.out文件中
ls / /abb 1>3.out 2>4.out 把两种信息重定向到不同文件
ls / /abb 1>5.out 2>5.out 不能重定向到同一个文件,会覆盖优先输入的信息,该命令会覆盖错误信息,文件中只有/目录的 信息
ls / /abb 1>6.out 2>&1 把1信息重定向到6.out 把错误信息重定向到1,不会覆盖
简单写法为 ls / /abb &>7.out 或者 ls / /abb >& 7.out
tips: > 前面没有空格,除了上面的&> 或者 >&的写法
<<< : 读取字符串 – read aad <<< “hello shell” 然后 echo $aad , 结果为hello shell
<<结束符: read aad< < : 读取文件: cat 0
tips: wc -l
环境变量:作用域为当前shell进程及其子进程; export VARNAME=VALUE VARNAME=VALUE export VARNAME “导出” 查看本地环境变量: env命令 Q:为什么每个用户都可以使用 JAVA_HOME? A:是因为每次用户登录进来后,都会启动~/.bashrc的文件,把变量export当前shell 本地变量 属于当前bash ,比如LANG=zh_CN.UTF-8,如果输入这个只是给当前bash设置了,其他没有设置,再启另一个,发现没有改变LANG的值 set VARNAME=VALUE: 作用域为整个bash进程; 局部变量(local) 虽然叫local其实是局部变量 属于一个函数 sxt(){ echo “sxt1” local bbb =hello } local VARNAME=VALUE:作用域为当前代码段; 特殊变量: $?: 上一个命令的执行状态返回值; 程序执行,可能有两类返回值: 0: 正确执行 1-255:错误执行,1,2,127系统预留; $#:位置参数个数 $*:参数列表,双引号引用为一个字符串 $@:参数列表,双引号引用为单独的字符串 $ $ (两个 $ 之间没有空格啊): 脚本运行时的当前进程的ID号,有时候会作为临时变量的后缀,haison.$$ 位置变量:(文件和函数中使用) $1,$2… vim a.test echo $1 echo $2 执行文件 source a.test a b 屏幕的结果为 a 回车 b 其他 管道| 管道命令会开启一个新的子bash,子bash会继承父bash里面的变量的值在其他情况下不会,需要export一下 •引用: –双引号:弱引用,参数扩展 ,把引号中的变量进行替换 –单引号:强引用,不可嵌套,把引号中所有类容当成字符串 -翻引号: `` 命令替换当成命令去执行 –花括号扩展不能被引用 –命令执行前删除引用:加转义字符 test -a + 文件 : 判断文件是否存在 test -d + 目录或文件: 判断对象是否是目录 test 3 -gt 2 : 判断3 是否大于2 等价于 [ 3 -gt 2 ] – 记得3,2 前后都有空格哦 test 3 -lt 8: 判断3是否小于8 等价于 [ 3 -lt 8 ] test 3 -le 3:判断3是否小于等于3 ps: 这些结果可以用 echo $? 查看命令的结果,本身没有任何输出 [ -f 文件] :测试文件是否是普通文件 [ -d 目录] :测试文件是否是目录 [ -n string ] : 判断字符串是否为空 [ -s string ] : 判断字符串是否不空 == ,!= 等号两端需要空格 (2.5补充) 表达式 a: [ expression ] – 使用 -a 进行逻辑与 ,使用 -o 进行逻辑或* b: test expression c: 任何一个命令都可以作为条件表达式 (3) 创建用户的脚本 #! /bin/bash useradd $1 echo $1 | passwd --stdin $1 – 设置与用户名相同的密码 echo “add user successfully” (4) 控制语句 if ;then;else;fi if test 3 -gt 2;then echo ok;else echo ook;fi – 如果3大于2,就输出ok,不大于输出ook for((;; ));do;done – (())里面的东东和java中类似,不用-gt -lt等直接用> <等就行 for((a=1;a<5;a++));do echo $a;done echo"haha" – 输出1-5的数字,最后输出haha 加强for循环 for in 1 2 3 4 5;do echo $i;done 输出1-5的最简单的写法为 seq 5 while(());do;done 和for一样的 也可以 写为 while [ ];do;done [ ]中写条件 这里就需要写成-gt的格式了 case 语句 tips: /dev/null 为"黑洞文件"可以把输出重定向"吃掉" 如 echo “ha” > /dev/null shadow文件: 加密密码后的第一个数字为用户创建时间,距离1970年的天数,密码最小使用天数,密码最大使用天数,密码距离最大使用天数前多少天进行警告. (5)算数运算符 a: let 算数运算符表达式 let c=$ A+$ B b: $[算术表达式] C = $ [$ A+$ B] c: $((算术表达式)) C=$ (($ A+$B)) d:expr 算术表达式1、 函数的定义 function 函数名(){ } 1 function可以省略,()不能省略, 2小括号中不能定义参数 3 函数体中可以定义函数,叫嵌套函数 4 函数体中可以写return,只能返回0-255之间的数字,代表当前函数的执行状态,如果没有retrun,执行状态为最后一行命令的状态 函数的调用 函数名就行,不要写小括号 给函数进行传递参数, 例如test(){ echo $1 } 函数调用test 100,如果在脚本中写,函数不能直接获取从键盘中输入的值 vim /etc/inittab 0 关闭模式 1 单机 2 无网络 3 默认为3的,完整模式 4 自定义 5 图形化界面 6 重启 chkconifg 345 10 90 :在3,4,5级别上启用,10启动的优先级 越小越优先,一般调整到比较靠后的比如99,90为关闭的优先级 chkconfig tomcat on 加入开机 chkconifg --list 查看列表 1 关于fd(这篇文章写得很好) http://c.biancheng.net/view/3066.html3 shell编程
3.1 shell变量
3.2 shell 流程控制
[ -e 文件] :测试文件是否存在
例如 if [ $# -gt 1 -a $# -lt 3 -o $# -eq 2 ];
其实就是(2)中的内容多了最下面的一条
ps: set ts = 4 设置tab为4个字符
case 变量 in
value1)
语句
;;
value2)
语句
;;
*) – 默认(其他情况)
语句
;;
esac
注意:表达式中各操作数及运算符之间要有空格。而且要使用命令引用参考文章: