【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