【shell学习】shell命令解释及特点
1.命令运行返回值
命令行运行成功,会返回0,不成功则会返回非0值查看命令 echo $?
[klaus@localhost learn]$ ls
ping01.sh ping02.sh ping03.sh ping04.sh ping05.sh
[klaus@localhost learn]$ echo $?
0
[klaus@localhost learn]$ lsl
bash: lsl: command not found...
[klaus@localhost learn]$ echo $?
127
2.查看使用的shell环境
[klaus@localhost learn]$ cat ping01.sh
#!/usr/bin/bash
ip1=4.2.2.2
ping -c1 $ip1 &>/dev/null && echo "$ip1 is ok!" || echo "$ip1 is fail!"
[klaus@localhost learn]$ which bash
/usr/bin/bash
[klaus@localhost learn]$ which sh
/usr/bin/sh
[klaus@localhost learn]$ bash ping01.sh
4.2.2.2 is ok!
[klaus@localhost learn]$ sh ping01.sh
4.2.2.2 is ok!
[klaus@localhost learn]$ ./ping01.sh
4.2.2.2 is ok!
#!/usr/bin/bash 开头设置程序运行的shell环境,定义用什么解释器去执行,Linux中称为shebang,其特点是如果在文件中引用多个shebang,但只有头一个生效;其次,sh其实是bash的软连接,用bash或sh都可以。
[klaus@localhost bin]$ ll sh
lrwxrwxrwx. 1 root root 4 Jan 14 04:33 sh -> bash
3.脚本的交叉使用
上节说到,当用到多个shebang时,只有第一个shebang起作用,如果这个脚本也需要用到其他调用,比如python,这样是可以做到的,定义开始和结束就可以,如下
[klaus@localhost learn]$ which python
/usr/bin/python
[klaus@localhost learn]$ cat ping00.sh
#!/usr/bin/bash
ip1=4.2.2.2
ping -c1 $ip1 &>/dev/null && echo "$ip1 is ok!" || echo "$ip1 is fail!"
/usr/bin/python <<EOF
print("hello, CentOS")
EOF
[klaus@localhost learn]$ ./ping00.sh
4.2.2.2 is ok!
hello, CentOS
这里需要注意的是,EOF只是一个定义的符号,其他的都可以,比如@@都可以,但是最后的一个EOF必须置顶,前面不能有空格。
4.程序执行特点
- c --编译-- 生成二进制机器码(CPU可执行),直接执行,
当指令集不一样的,不可执行,比如x86的架构和ARM价格,PowerPC价格不同,往往需要交叉编译 - shell --解释-- 执行时再去检逻辑
- Java --编译-- 编译成字节码(CPU不能直接运行),需要Java虚拟机,安装JDK。
- python --解释–执行时再去检逻辑
–编译-- 编译成字节码(CPU不能直接运行),区别于Java,用的是python虚拟机。
编译 — 修改后需要重新编译,才能执行。
解释 — 直接修改,灵活性高
5.bash环境
仔细观察su之后的文件路径
[klaus@localhost learn]$ su - root
Password:
[root@localhost ~]# logout
[klaus@localhost learn]$ su root
Password:
[root@localhost learn]# exit
su root:当前shell环境没变,su - root:整个切换到root的shell环境
6.管道|
一个命令的输出当做下一个命令的输入
[klaus@localhost learn]$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:df:bd:6c brd ff:ff:ff:ff:ff:ff
inet 192.168.189.131/24 brd 192.168.189.255 scope global noprefixroute dynamic ens33
valid_lft 1700sec preferred_lft 1700sec
inet6 fe80::a973:e55c:a572:eb0f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:2c:7c:71 brd ff:ff:ff:ff:ff:ff
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:2c:7c:71 brd ff:ff:ff:ff:ff:ff
[klaus@localhost learn]$ ip addr| grep 'inet'
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
inet 192.168.189.131/24 brd 192.168.189.255 scope global noprefixroute dynamic ens33
inet6 fe80::a973:e55c:a572:eb0f/64 scope link noprefixroute
[klaus@localhost learn]$ ip addr| grep 'inet' | grep ens33
inet 192.168.189.131/24 brd 192.168.189.255 scope global noprefixroute dynamic ens33
6.1 和管道一起使用的tee命令
将第二个输出内容存到test上
[klaus@localhost learn]$ ip addr| grep 'inet' | grep ens33
inet 192.168.189.131/24 brd 192.168.189.255 scope global noprefixroute dynamic ens33
[klaus@localhost learn]$ ip addr| grep 'inet' |tee test | grep ens33
inet 192.168.189.131/24 brd 192.168.189.255 scope global noprefixroute dynamic ens33
[klaus@localhost learn]$ ls
ping00.sh ping01.sh ping02.sh ping03.sh ping04.sh ping05.sh test
[klaus@localhost learn]$ cat test
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
inet 192.168.189.131/24 brd 192.168.189.255 scope global noprefixroute dynamic ens33
inet6 fe80::a973:e55c:a572:eb0f/64 scope link noprefixroute
其中tee test是以覆盖的形式往test里面写内容,换成tee -a test是以追加的形式写入内容。
6.2 用作更好的重定向功能
[klaus@localhost learn]$ date > test.txt
[klaus@localhost learn]$ date | tee test.txt #显示并写入内容
Wed Jan 15 00:13:41 EST 2020
7.命令排序
多命令同时执行时,用’;'隔开,每个命令独立存在
[klaus@localhost learn]$ cd;ls;pwd
Desktop Documents Downloads Music Pictures Public Templates Videos
/home/klaus
逻辑判断 &&、||
[klaus@localhost learn]$ mkdir hh/zz && echo "ok"
mkdir: cannot create directory ‘hh/zz’: No such file or directory
[klaus@localhost learn]$ mkdir -p hh/zz && echo "ok" #执行成功才执行下一个
ok
[klaus@localhost learn]$ mkdir hh/zz || echo "ok"
mkdir: cannot create directory ‘hh/zz’: File exists #执行不成功仍执行下一个
ok
联合使用
[klaus@localhost learn]$ ping -c1 4.2.2.2 &>/dev/null && echo "ping 4.2.2.2 is ok" || echo "ping 4.2.2.2 is fail"
ping 4.2.2.2 is ok