1、 bash的工作特性之命令執行狀態返回值和命令行展開所涉及的內容及其示例演示。
一、bash特性:
1、命令別名
獲:取當前用戶可用的別名的定義
2、命令歷史:
shell進程會保存其會話中用戶曾經執行過的命令;命令通過其“歷史文件”來持久保存此前執行過的命令;每個用戶都有其自己專用的歷史文件;
HISTSIZE:shell進程的緩衝區保留的歷史命令的條數;
HISTFILESIZE:命令歷史文件可保存的歷史命令的條數;
history -c:清空命令歷史;
history -d OFFSET:刪除指定的條目;
3、快捷鍵
Ctrl+a:跳至命令行首;
Ctrl+e:跳至命令行尾;
Ctrl+k:刪除光標所在處至尾部的內容;
Ctrl+u:刪除行首至光標所在處的內容;
4、命令補全和路徑補全
命令補全:
shell程序在接收到用戶執行命令的請求且分析完成之後,最左側字符串將被當作命令去查找;
查找機制:
(1) 查找內部命令;
(2) 查找外部命令:
1、去$PATH變量所指定的各路徑下,自左而右逐個搜索各目錄下的文件名
2、給定的打頭的字符串如果能惟一標識某命令程序文件的文件名,則直接補全;
3、不能惟一標識,再擊tab可給列表;
4、錯誤:沒有任何命令可被此打頭字符串標識;
路徑補全:
在給定的起始路徑的上級目錄下,以對應路徑下的打頭字符串來逐一匹配上級目標下的每個文件:
惟一標識:tab補全;
不能惟一標識:tab,tab給出列表;
錯誤路徑:沒有響應;
5、命令行展開
把命令行的給定的特殊符號自動替換爲相應字符串的機制;
~: 自動替換爲用戶家目錄;
~USERNAME:自動替換爲指定用戶的家目錄;
{}:可承載一個以逗號分隔的路徑列表,能夠將其展開爲多個獨立路徑;
6、命令的執行狀態結果
命令的正常輸出結果:命令的返回值;
通過引用來保存下來或直接調用——"命令引用"
7、變量
程序:指令+數據
數據:文件、變量;
變量:內存空間,有名稱,名稱即爲變量名,對應的內存空間中的數據即爲變量的值;
變量賦值:左邊=右邊(把右邊存儲到左邊指向的內存空間)
二、命令執行狀態返回值
用 $? 取出最後一個帶返回值的函數調用.
如果你確定某個命令或函數有返回值,就可以在調用這條命令後用 $?
取出返回值並處理.在bash中習慣用返回值0代表一切正常.
比如最常用的 ls 命令,有三個返回值:
0 : 一切正常
1: 小問題 (比如無法訪問某個子目錄)
2: 大麻煩 (比如找不到命令所需參數)
在終端執行了 ls 命令後,就可以用 echo $? 來查看返回值.
注意 $? 取出的是最後一個返回值,意思是如果某個命令沒有返回值,那麼 $? 會返回最後一個有返回值的命令的返回值.
請使用命令行展開功能來完成以下練習:
(1)、創建/tmp目錄下的:a_c,a_d, b_c, b_d
[root@localhost tmp]# mkdir -v {a,b}_{c,d}
mkdir: 已創建目錄 "a_c"
mkdir: 已創建目錄 "a_d"
mkdir: 已創建目錄 "b_c"
mkdir: 已創建目錄 "b_d"
(2)、創建/tmp/mylinux目錄下的:
mylinux/
├── bin
├── boot
│ └── grub
├── dev
├── etc
│ ├── rc.d
│ │ └── init.d
│ └── sysconfig
│ └──network-scripts
├── lib
│ └── modules
├── lib64
├── proc
├── sbin
├── sys
├── tmp
├── usr
│ └── local
│ ├── bin
│ └── sbin
└── var
├── lock
├── log
└── run
[root@localhost tmp]# mkdir -vp mylinux/{bin,boot/grub,dev,etc/{rc.d/init.d,sysconfig/network-scripts},lib/modules,lib64,proc,sbin,sys,tmp,usr/local{bin,sbin},var,lock,lock,log,run}
mkdir: 已創建目錄 "mylinux/bin"
mkdir: 已創建目錄 "mylinux/boot"
mkdir: 已創建目錄 "mylinux/boot/grub"
mkdir: 已創建目錄 "mylinux/dev"
mkdir: 已創建目錄 "mylinux/etc"
mkdir: 已創建目錄 "mylinux/etc/rc.d"
mkdir: 已創建目錄 "mylinux/etc/rc.d/init.d"
mkdir: 已創建目錄 "mylinux/etc/sysconfig"
mkdir: 已創建目錄 "mylinux/etc/sysconfig/network-scripts"
mkdir: 已創建目錄 "mylinux/lib"
mkdir: 已創建目錄 "mylinux/lib/modules"
mkdir: 已創建目錄 "mylinux/lib64"
mkdir: 已創建目錄 "mylinux/proc"
mkdir: 已創建目錄 "mylinux/sbin"
mkdir: 已創建目錄 "mylinux/sys"
mkdir: 已創建目錄 "mylinux/tmp"
mkdir: 已創建目錄 "mylinux/usr"
mkdir: 已創建目錄 "mylinux/usr/localbin"
mkdir: 已創建目錄 "mylinux/usr/localsbin"
mkdir: 已創建目錄 "mylinux/var"
mkdir: 已創建目錄 "mylinux/lock"
mkdir: 已創建目錄 "mylinux/log"
mkdir: 已創建目錄 "mylinux/run"
[root@localhost tmp]# tree mylinux/
mylinux/
├── bin
├── boot
│ └── grub
├── dev
├── etc
│ ├── rc.d
│ │ └── init.d
│ └── sysconfig
│ └── network-scripts
├── lib
│ └── modules
├── lib64
├── lock
├── log
├── proc
├── run
├── sbin
├── sys
├── tmp
├── usr
│ ├── localbin
│ └── localsbin
└── var
23 directories, 0 files
2、 顯示/var目錄下所有以l開頭,以一個小寫字母結尾,且中間至少出現一位數字(可以有其它字符)的文件或目錄。
# ls -d /varl[0-9][a-z]
3、 顯示/etc目錄下,以任意一個數字開頭,且以非數字結尾的文件或目錄。
# ls -d /etc/[0-9]*[^0-9]
4、 顯示/etc目錄下,以非字母開頭,後面跟了一個字母以及其它任意長度任意字符的文件或目錄。
# ls -d /etc/[^[:alpha:]][:alpha:]*
5、 在/tmp目錄下創建以tfile開頭,後跟當前日期和時間的文件,文件名形如:tfile-2016-09-20-09-32-22。
[root@localhost/]# touch /tmp/tifile-$(date +%Y-%m-%d-%H-%M-%s)
[root@localhost/]# tree tmp/
tmp/
├── a_c
├── a_d
├── b_c
├── b_d
├── hogsuspend
├── hsperfdata_root
├── ks-script-NLcIuI
├── mylinux
│ ├── bin
│ ├── boot
│ │ └── grub
│ ├── dev
│ ├── etc
│ │ ├── rc.d
│ │ │ └── init.d
│ │ └── sysconfig
│ │ └── network-scripts
│ ├── lib
│ │ └── modules
│ ├── lib64
│ ├── lock
│ ├── log
│ ├── proc
│ ├── run
│ ├── sbin
│ ├── sys
│ ├── tmp
│ ├── usr
│ │ ├── localbin
│ │ └── localsbin
│ └── var
├── rum}
├── ssh-BDYivi6ssnZb
│ └──agent.9212
├──systemd-private-8cd552a6d9714a318bd446f3db041a62-colord.service-SoabcN
│ └── tmp
├──systemd-private-8cd552a6d9714a318bd446f3db041a62-cups.service-jDUnI5
│ └── tmp
├──systemd-private-8cd552a6d9714a318bd446f3db041a62-vmtoolsd.service-Ai9zY1
│ └── tmp
│ └── vmware-root
├── test
├── tifile-2016-12-11-22-13-1481465608
├──tracker-extract-files.0
├── yum.log
└──yum_save_tx.2016-12-11.16-26.gZug1a.yumtx
40 directories, 6 files
6、 複製/etc目錄下所有以.d結尾的文件或目錄至/tmp/mytest2目錄中。
[root@localhost etc]# mkdir -vp/tmp/mytest2
mkdir: 已創建目錄"/tmp/mytest2"
[root@localhost etc]# cp -vr /etc/*.d/tmp/mytest2
7、 複製/etc/目錄下所有以l或m或n開頭,以.conf結尾的文件至/tmp/mytest3目錄中。
[root@localhost etc]# mkdir -vp/tmp/mytest3
mkdir: 已創建目錄"/tmp/mytest3"
[root@localhost etc]# cp -a/etc/[l,m,n]*.conf /tmp/mytest3
[root@localhost etc]# cd ..
[root@localhost /]# cd tmp
[root@localhost tmp]# tree mytest3/
mytest3/
├── ld.so.conf
├── libaudit.conf
├── libuser.conf
├── locale.conf
├── logrotate.conf
├── man_db.conf
├── mke2fs.conf
├── mtools.conf
├── nfsmount.conf
├── nsswitch.conf
├── ntp.conf
└── numad.conf
0 directories, 12 files