【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
發佈了81 篇原創文章 · 獲贊 87 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章