type 查看是否是Bash内置命令
不加参数时, 会显示是不是内置命令
-t 会显示如下的内容
file 表示外部命令
alias 表示该命令为命令别名所设置的别名
builtin 为bash内置的命令
输入命令的一些小技巧
cp /xxx/xxxx/xxxx/xxxx /xxxx/xxx/xxxx/xxx \
> /xxx/xxx/xx 命令太长换行, 是\紧接着回车
组合键 | 功能 |
ctrl + u ctrl + k | u从光标向前删除 k从光标先后删除 |
ctrl + a ctrl + e | a光标移到命令最前面, e最后名, 其实home和end就可以 |
ちょっと難しい变量
1 echo, unset
echo ${myname} 调用变量, 不会返回它的值, 因为没有提前设置
myname=desky 设置变量, 都紧挨着=
echo ${myname} 在调用, 有值返回 ${ 紧挨着, 不能有空格
echo $myname 这样调用也可以
unset myname 删除变量
2 BB下 变量的命名规则
- myname=aki 千万不能有空格
- myname=desky aki 这种也不行, 因为有空格
- 变量只能是英文字母或数字, 但是不能以数字开头, 实测以_开头也可以, 说明不止数字字母
- 若是有空格可以用'' "" 单引号和双引号将变量引起来, 或是用\ 转义,\可以转义回车, 空格,等特殊字符 aki='12 3',aki=12\ 4
- 单引号和双引号的区别
双引号内的特殊字符,还保留原本特性,如果有$xx, 把它看成一个变量
如 var="lang is $LANG" ,echo var 返回 lang is zh_CN.utf8
单引号,则把它统一看成字符串
var='lang is $LANG' ,echo var 返回 lang is $LANG
- 当需要借由其他额外操作命令是, 可以使用 反单引号 ` 是Tab上面的键,给额外操作括起来:或者用$()。 version=$(uname -r) 再调用 echo version 或者 version=`ll` echo $version
- 扩充变量时, aki="$aki"123,或 aki=${aki}123
- 若该变量要在其他子进程引用, 则要先 export 变量
下面是几个例子
name="aki's name" 里面有单引号, 外面套个双引号
或者 name=aki\'s\ name 转义
下面是子进程用变量的例子
name=aki
bash 进入到子进程
echo $name
没有 返回值
exit 退出子进程,
export name 回到主进程, 并把变量name设置为全局变量, 注意没有$
bash 进入子进程
echo $name 调用
aki 有返回值
3 拓展下反单引号的意义, 在一行命令中先执行``里面的命令
4 env 查看环境变量与常见的环境变量说明
里面有个RANDOM, 可以随机生成随机数
echo $RANDOM 生成0~32767 之间的一个随机数
declare -i number=$RANDOM*10/32768 ;echo $number 生成0~9 的随机数
5 set 查看所有的变量(环境变量和自定义变量)
里面有个PS1, 有趣但感觉没什么卵用,,可以详见鸟哥323
echo $$ 显示当前BASH的pid
echo $? 显示上一个命令的返回值, 上一个命令如果执行成功,会返回0;失败则返回错误码
12=ll 前面变量以数字开头, 会报错
echo $? 返回127 错误码
echo $? 返回0, 因为上一条是echo $? 正常执行, 返回0
6 关于export
大概吹吹原理,
但登录linux时,取得一个Bash(就是进入终端), 进入的Bash就是个独立的进程, 再bash下,就会进入一个子进程,第一个Bash就是父进程,暂时睡着了,新的子进程仅会继承父进程的环境变量(全局变量), 不会继承自定义变量(局部变量),exit退出子进程, 回到父进程。
所以,在父进程export, 就是把父进程的自定义变量(局部变量)变成环境变量(全局变量)供子进程使用。
export 变量名 注意变量名前面没有$
如果仅执行 export 会把所有的全局变量显示出来。
7 关于read, arry, declare
①read: 类似py的input
-p 后面加提示文字
-t 等待秒数
[root@localhost ~]# read aki
ll sadasdl d
[root@localhost ~]# echo $aki
ll sadasdl d
[root@localhost ~]# read -p "please inpuit" -t 20 aki
please inpuit123
[root@localhost ~]# echo $aki
123
②declare, typeset 声明变量
-a 将后面的变量变成数组类型
-i 将后面的变量变成整数类型
-x 把后面的变量变成全局变量
-r 把变量设置成readonly, 变量只能读, 不能修改, 不能 unset 删掉
变量的默认类型是字符串,所以100+300, 把它看成字符串, 不会帮你计算
但用declare声明它是数字类型时, 会自动帮你计算。
[root@localhost ~]# sum=100+300
[root@localhost ~]# echo $sum
100+300
[root@localhost ~]# declare -i sum=100+300
[root@localhost ~]# echo $sum
400
declare -x sum 声明成全局变量
declare +x sum 变回局部变量
declare -r sum 变量设置成只读
declare +r sum 撤销只读操作
③关于鸡肋的数组
[root@localhost ~]# var[1]="a"
[root@localhost ~]# var[2]="b"
[root@localhost ~]# var[3]="c"
[root@localhost ~]# echo "${var[1]},${var[2]},${var[3]}"
a,b,c
[root@localhost ~]# echo "$var[1],${var[2]},${var[3]}"
[1],b,c
不加{} 会出错
八 ulimit文件系统和程序的限制关系
-H 严格设置
-S 警告设置 超过警告设置会警告
-a 后面不加任何参数, 列出所有的限度
-f 能建立文佳的最大容量限制 单位k
-d 程序能使用的最大内存量
-t 可使用的最大cpu时间
-u 单一使用者可以使用最大进程数量
限制使用者只能建立10M以下的容量文件
ulimit -f 10240
要恢复ulimit 限制最简单的就是 注销再登陆。
九 命令别名 alias unalias
alias lm='ls -al | more' 设置别名
alias 查看别名
unalias lm 删除别名
十 历史命令 hisyory
n 数字, 列出最近的n条命令
-c 删除history
-a 将目前新增的的history加到指定的文件中, 不加默认放到~/.bash_histort
-r 将指定的文件的内容 读到目前这个shell的histiry
-w 将目前的history记录写到指定的文件中
history -w 写道~/.bash_histort中, 就是更新history
说是不手动history -w 更新的话, 只能再注销时, 系统自动更新, 但在实操中, 不用手动更新, 也不需要注销, history会自动更新。
! num 执行history的第几条命令
! command 执行history指定命令, ! hi 自动找到最近hi开头的命令
!! 上一条命令, 相当于上箭头
Q如果同一个用户开了多个执行不同命令, history怎么存?
A最后注销的哪个会覆盖先注销的history