【shell】shell命令解释及特点

【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
发布了80 篇原创文章 · 获赞 86 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/klaus_x/article/details/103987620