echo "hello world!" 报错,因为!有特殊含义
echo 'hello world!' 正常输出
:向左删除一个字符
:换行
:输出一个制表符,tab
\:输出一个
echo -e "abc" 输出 ac
1.sh
#!/bin/sh
echo "leilei is a good man"
说明:复杂的程序必须写 #!/bin/sh 表示这是一个脚本,简单的可以不写
脚本执行 1:绝对路径 /tmp/1.sh
2:相对路径 ./.sh
3:sh执行 sh 1.sh
假如在windows中编辑的脚本,在linux中执行报错:没有那个文件或目录
因为回车符不对,linux中回车符是$,用cat -A 1.sh可以看到,改变方法:
dos2unix 1.sh
查看历史命令:
history
history -c :清除历史命名
history -w :把缓存中的命令写入历史命令保存文件 ~/.bash_history
默认历史命令保存1000条,可以修改:/etc/profile 中:HISTSIZE=1000,重新登录才会生效
如果超过了条数,会删除前面的,保存后面的
命令别名:alias 别名='原命令' 重启系统消失
永久生效修改文件:vim /root/.bashrc
添加 例如
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
查询别名:alias
删除别名:unalias 别名
快捷键:
ctrl+u:删除命令
l:清屏
输出重定向:以前命令的结果输出在屏幕上,现在输出到文件中,改变了方向,所以叫做输出重定向。
格式:命令>文件 或者 命令>>文件, 双大于号是追加到文件中。
ll>a.txt ll命令查询的结果输入到 a.txt中
ll>>a.txt ll命令查询的结果追加到 a.txt中
输入了错误命令,产生报错信息:adada 2>a.txt 或者 adaf 2>>a.txt 2和大于号之间不能有空格
正确运行与错误运行的命令都能保存:
命令 >& 文件 或者 命令 >>& 文件
使命令不在输出 理解为把输出丢到垃圾箱中
ls &>/dev/null
正确和错误命令分别输出:
格式: 命令 >>文件1 2>>文件2
输入重定向:本来是通过键盘输入的,现在改变方向,用文件输入。
[root@localhost tmp]# wc
as as as
as
as
as as as as as
4 10 30
wc命令 统计 4行,10个单词,30个字符
[root@localhost tmp]# wc <ab.txt
11 92 620
说明:ab.txt 中有11行,96个单词,620个字符
[root@localhost tmp]# cat ab.txt
总用量 1452
-rwxr-xr-x 1 root root 38 6月 6 03:08 1.sh
-rw-r--r-- 1 root root 0 6月 6 09:47 ab.txt
-rw-r--r-- 1 root root 670293 6月 1 10:21 boduo
-rw-r--r-- 1 root root 123932 6月 1 10:21 boduo.bz2
drwxr-xr-x 4 root root 36 6月 1 10:30 Japan
-rw-r--r-- 1 root root 163 6月 1 11:16 Japan.tar.bz2
-rw-r--r-- 1 root root 669336 6月 1 18:18 services
-rw-r--r-- 1 root root 80 6月 1 19:32 shenlei1.txt
-rw-r--r-- 1 root root 19 6月 1 19:31 shenlei2.txt
drwx------ 3 root root 17 6月 5 22:05 systemd-private-415ebfa5fd6f44d49f7c303febb40a70-chronyd.service-6Ivqzi
多命令顺序执行:
; 命令1;命令2 分号,命令之间没有任何关系
&& 命令1&&命令2 逻辑与,命令1正确执行,才会执行命令2
|| 命令1||命令2 逻辑或,命令1不正确,命令2才执行
| 命令1|命令2 管道符,命令1的正确输出作为命令2的操作对象
通配符和其他特殊符号:
?:匹配一个任意字符
* :匹配0或多个
[]:匹配中括号中的一个字符
[-]:例如[a-z]代表匹配一个小写字母
[^]:例如[^0-9]代表匹配一个不是数字的字符
'':单引号 即使包含特殊字符 也会原样输出
"":双引号 特殊字符有特殊含义
$():小括号中写命令,执行命令,例如:echo $(ls) 输出ls执行的结果
举例:
[root@localhost tmp]# echo $(date)
2019年 06月 06日 星期四 11:49:40 CST
[root@localhost tmp]# echo "$(date)"
2019年 06月 06日 星期四 11:49:52 CST
[root@localhost tmp]# echo '$(date)'
$(date)
shell中变量类型:
用户自定义变量
环境变量:主要保存的是和系统操作环境相关的数据。(与系统相关的不能改名,可以改值, 可以添加环境变量)
位置参数变量:主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。(不能改名)
预定义变量:Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。(不能改名)
变量可以由字母、数字、下划线组成,不能用数字开头
变量的默认类型都是字符串类型,如果要进行数值运算,则必须修改指定变量类型为数值型。
变量赋值,等号两侧不能有空格 name=ssd
变量值有空格时用单引号或者双引号 name="shenlei hah"
查看变量 set
删除变量 unset 变量名
环境变量是什么?
用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和这个shell的所有子shell当中生效。如果把环境变量写入
相应的配置文件,那么这个环境变量就会在所有的shell中生效。
声明环境变量:export 变量名=变量值
查询变量: env
删除变量: unset 变量名
name=shenlei
export age=18
sex=nan
export sex
[root@localhost ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon
├─irqbalance
├─login───bash
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─mysqld───26*[{mysqld}]
├─polkitd───6*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd─┬─sshd───bash
│ └─sshd───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
└─tuned───4*[{tuned}]
set命令可以看到:
age=18
name=shenlei
sex=nan
进入子shell
[root@localhost ~]# bash
[root@localhost ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon
├─irqbalance
├─login───bash
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─mysqld───26*[{mysqld}]
├─polkitd───6*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd─┬─sshd───bash
│ └─sshd───bash───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
└─tuned───4*[{tuned}]
执行set命令,只能看到环境变量:
age=18
sex=nan