您好,登錄后才能下訂單哦!
命令幫助信息獲取
sh 執行腳本
-x選項來查看這個腳本執行過程的
[root@localhost?~]#?sh?1.sh [root@localhost?~]#?sh?-x?1.sh? [root@localhost?~]#?./1.sh
-n 只讀取shell腳本,但不實際執行
-x 進入跟蹤方式,顯示所執行的每一條命令
echo
將輸入的字符串送往標準輸出。
用echo命令輸出加引號的字符串時,將字符串原樣輸出;用echo命令輸出不加引號的字符串時,將字符串中的各個單詞作為字符串輸出,各字符串之間用一個空格分割。
參 數:
-n 不要在最后自動換行
-e 若字符串中出現以下字符,則特別加以處理,而不會將它當成一般文字輸出: ??
????\a 發出警告聲; ??
????\b 刪除前一個字符; ??
????\c 最后不加上換行符號; ??
????\f 換行但光標仍舊停留在原來的位置; ??
????\n 換行且光標移至行首;
[root@Zabbix?~]#?echo?-e?'aaa\nbbb' aaa bbb [root@Zabbix?~]#
?echo顯示帶顏色,需要使用參數-e
格式如下:
echo -e "\033[字背景顏色;文字顏色m字符串\033[0m"
例如:?
echo -e "\033[41;37m TonyZhang \033[0m"
其中41的位置代表底色, 37的位置是代表字的顏色
?注:
1、字背景顏色和文字顏色之間是英文的“""”
2、文字顏色后面有個m
3、字符串前后可以沒有空格,如果有的話,輸出也是同樣有空格
下面看幾個例子:
echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 紅色字 \033[0m"
echo -e "\033[32m 綠色字 \033[0m"
echo -e "\033[33m ×××字 \033[0m"
echo -e "\033[34m 藍色字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m"
echo -e "\033[36m 天藍字 \033[0m"
echo -e "\033[37m 白色字 \033[0m"
?
echo -e "\033[40;37m 黑底白字 \033[0m"
echo -e "\033[41;37m 紅底白字 \033[0m"
echo -e "\033[42;37m 綠底白字 \033[0m"
echo -e "\033[43;37m 黃底白字 \033[0m"
echo -e "\033[44;37m 藍底白字 \033[0m"
echo -e "\033[45;37m 紫底白字 \033[0m"
echo -e "\033[46;37m 天藍底白字 \033[0m"
echo -e "\033[47;30m 白底黑字 \033[0m"
控制選項說明 :
\33[0m 關閉所有屬性?
\33[1m 設置高亮度?
\33[4m 下劃線?
\33[5m 閃爍?
\33[7m 反顯?
\33[8m 消隱?
\33[30m -- \33[37m 設置前景色?
\33[40m -- \33[47m 設置背景色?
\33[nA 光標上移n行?
\33[nB 光標下移n行?
\33[nC 光標右移n行?
\33[nD 光標左移n行?
\33[y;xH設置光標位置?
\33[2J 清屏?
\33[K 清除從光標到行尾的內容?
\33[s 保存光標位置?
\33[u 恢復光標位置?
\33[?25l 隱藏光標?
\33[?25h 顯示光標?
??\r 光標移至行首,但不換行; ??
????\t 插入tab;?
[root@Zabbix?~]#?echo?aaa\tbbb aaatbbb [root@Zabbix?~]#?echo?'aaa\tbbb' aaa\tbbb [root@Zabbix?~]#?echo?-e?aaa\tbbb aaatbbb [root@Zabbix?~]#?echo?-e?'aaa\tbbb' aaa bbb [root@Zabbix?~]#
????\v 與\f相同; ??
????\\ 插入\字符; ?
????\nnn 插入nnn(八進制)所代表的ASCII字符;
``反引號的作用就是將反引號內的Linux命令先執行,然后將執行結果賦予變量。
如果在命令行上把Linux命令放在反引號中,這個命令會首先被執行,其結果會成為命令行的一個參數。類似的還有$( ),這里是括號,不是花括號,${ }就是取變量了,比如:echo ${PATH},{}是為了避免后面的影響到了,比如參數${a}a這樣連著使用。如果不用{},系統就會識別成$aa了
[root@localhost?~]#?echo?`df?-Th`?>?cat.txt? [root@localhost?~]#?cat?cat.txt? Filesystem?Type?Size?Used?Avail?Use%?Mounted?on?/dev/sda3?ext4?18G?3.0G?14G?18%?/?tmpfs?tmpfs?504M?76K?504M?1%?/dev/shm?/dev/sda1?ext4?194M?28M?157M?15%?/boot?/dev/sr0?iso9660?64M?64M?0?100%?/media/VMware?Tools [root@localhost?~]#
單引號和反引號之間的區別。單引號把Linux命令視為字符集合。反引號會強迫執行Linux命令。
cd--change directory---切換工作目錄
[root@localhost?~]#?cd?/home [root@localhost?home]#?pwd /home [root@localhost?home]#?cd?/usr/local/src/ [root@localhost?src]#?pwd /usr/local/src [root@localhost?src]#
說明:
1.目錄名稱省略,變換至使用者的 home directory (也就是剛 login 時所在的目錄)
2."~" 表示為 home directory 的意思
3."." 則是表示目前所在的目錄
4.".." 則表示目前目錄位置的上一層目錄
5.“-” 返回進入當前目錄前所在目錄
[root@localhost?src]#?cd [root@localhost?~]#?pwd /root [root@localhost?~]#?cd?- /usr/local/src [root@localhost?src]#?pwd /usr/local/src [root@localhost?src]#?cd?.. [root@localhost?local]#?pwd /usr/local [root@localhost?local]#?cd?. [root@localhost?local]#?pwd /usr/local [root@localhost?local]#?cd?~ [root@localhost?~]#?pwd /root [root@localhost?~]#
6."!$" 把上個命令最后的參數作為輸入
[root@localhost?src]#?mkdir?/usr/local/nagios [root@localhost?src]#?tar?zxvf?nagios-3.5.0.tar.gz?-C?/usr/local/nagios [root@localhost?src]#?cd?!$ cd?/usr/local/nagios [root@localhost?nagios]#
ifconfig----查看本機IP地址
[root@Git-Client?~]#?ifconfig [root@Project?~]#?ip?addr [root@Project?~]#?ip?addr?show?ens160
curl ifconfig.me查看本機公網IP
[root@Git-Client?~]#?curl?ifconfig.me
cp---復制文件或者目錄
[root@localhost?~]#?cp?/etc/sysconfig/network-scripts/ifcfg-eth0?/etc/sysconfig/network-scripts/ifcfg-eth0bak [root@localhost?test]#?ls test.txt [root@localhost?test]#?cp?test.txt{,bak} [root@localhost?test]#?ls test.txt??test.txtbak [root@localhost?test]#?cp?/etc/sysconfig/iptables{,`date?+%Y%m%d`bak}
-a 盡可能將檔案狀態、權限等資料都照原狀予以復制,其作用等于dpR選項的組合 ,
-r 若 source 中含有目錄名,則將目錄下檔案也依序拷貝至目的地,復制目錄時必須使用此選項
[root@localhost?local]#?cp?nagios/?/usr/local/src/ cp:?略過目錄"nagios/" [root@localhost?local]#?cd?nagios/ [root@localhost?nagios]#?ls nagios [root@localhost?nagios]#?cp?-r?nagios/?/usr/local/src/ [root@localhost?nagios]#?cp?-a??nagios/?/usr/local/src/nagios1
-f 若目的地已經有相同檔名的檔案存在,則在復制前先予以刪除再行復制。
-u :若 destination 比 source 舊才更新 destination !或目的地文件 不存在時才進行復制
-i :若目的檔(destination)已經存在時,在覆蓋時會先詢問是繼續
? ? ?有時候使用-f參數也會提示是否覆蓋,linux系統中有時候給cp建了一個alias:
[root@localhost?~]#?alias|grep?cp alias?cp='cp?-i' [root@localhost?~]#
當你執行cp時,其實執行的是cp -i,如果不想每次詢問可以直接注釋掉。重新打開回話窗口不再提示
[root@localhost?~]#?cat?~/.bashrc?|grep?cp #alias?cp='cp?-i' [root@localhost?~]#
如果臨時取消掉,可以通過以下
[root@localhost?static]#?unalias?cp [root@localhost?static]#?cp?/usr/local/src/static/*?.?-a [root@localhost?static]#
-d:拷貝軟連接時需要加上該參數,否則把軟連接的目標文件拷貝過去,而加上后,其實只是拷貝了一個連接文件。
-p :連同檔案的屬性一起復制過去,而非使用預設屬性
拷貝目錄:
[root@localhost?dir]#?mkdir?dir?dir1 [root@localhost?dir]#?touch?dir/file{1..9} [root@localhost?dir]#?cp?-r?dir?dir1/ [root@localhost?dir1]#?ls dir [root@localhost?dir1]#
Tips:可以多個目錄一起拷貝 最后一個為目標目錄
[root@justin?~]#?cp?/etc/rc.sysinit?/etc/inittab?/mnt/lv1/ [root@justin?~]#?ls?!$ ls?/mnt/lv1/ inittab??lost+found??rc.sysinit [root@justin?~]#
如果要排除/home/data目錄下面的a、b、c、三個目錄,同時拷貝其它所有目錄,執行以下命令
yum?install?rsync???#安裝rsync rsync?-av?--exclude?data/a??--exclude?data/b??--exclude?data/c??data???/bak
注意:--exclude后面的路徑不能為絕對路徑,必須為相對路徑才可以,否則出錯。且備份的目錄data不能寫成data/
-v, --verbose 詳細模式輸出?
-c, --checksum 打開校驗開關,強制對文件傳輸進行校驗?
-a, --archive 歸檔模式,表示以遞歸方式傳輸文件,并保持所有文件屬性,等于-rlptgoD?
-z, --compress 對備份的文件在傳輸時進行壓縮處理
-r, --recursive 對子目錄以遞歸模式處理?
-R, --relative 使用相對路徑信息?
-b, --backup 創建備份,也就是對于目的已經存在有同樣的文件名時,將老的文件重新命名為~filename。可以使用--suffix選項來指定不同的備份文件前綴。?
--exclude=PATTERN 指定排除不需要傳輸的文件模式?
--exclude=PATTERN 指定排除不需要傳輸的文件模式?
--include=PATTERN 指定不排除而需要傳輸的文件模式?
--exclude-from=FILE 排除FILE中指定模式的文件?
--include-from=FILE 不排除FILE指定模式匹配的文件?
scp
[root@localhost?app]#?scp?-r?ProxyServer?root@192.168.1.104:/app
-p 可以保持文件屬性不變
[root@localhost?~]#?scp?-rp?*?root@10.15.44.239:/var/log/remote/
獲得完整的文件路徑
[root@localhost?soft]#?readlink?-f?docker-check-config.sh? /app/soft/docker-check-config.sh [root@localhost?soft]#
登陸自動指定目錄
在用戶的.bash_profile里添加cd 目錄
[root@localhost?~]#?pwd /root [root@localhost?~]#?vim?/root/.bash_profile? #?.bash_profile #?Get?the?aliases?and?functions if?[?-f?~/.bashrc?];?then ????????.?~/.bashrc fi cd?/sh #?User?specific?environment?and?startup?programs PATH=$PATH:$HOME/bin export?PATH
mv---移動或重命名文件
[root@Zabbix_server?fonts]#?ls DejaVuSans.ttf??STXINGKA.TTF [root@Zabbix_server?fonts]#?mv?DejaVuSans.ttf{,bak} [root@Zabbix_server?fonts]#?ls DejaVuSans.ttfbak??STXINGKA.TTF [root@Zabbix_server?fonts]#
-b ? ? ? ? ? ? ? ?如果已存在相同文件名,則覆蓋前進行備份
-f ? ? ? ? ? ? ? ? 如果已存在相同文件名,而用戶不具有寫的權限,則強制覆蓋
-i ? ? ? ? ? ? ? ? 如果已存在相同文件名,覆蓋前提示用戶進行確認
-u ? ? ? ? ? ? ? ?比較原文件與目標文件修改時間,如果目標文件較新則不覆蓋
-v ? ? ? ? ? ? ? ?列出所有被移動或重命名的文件
-i 若目的地已有同名檔案,則先詢問是否覆蓋舊檔
[root@localhost?~]#?cd?/home/ [root@localhost?home]#?touch?justinmv [root@localhost?home]#?ls justin??justinmv??lost+found??t [root@localhost?home]#?mv?justinmv?justin1 [root@localhost?home]#?ls justin??justin1??lost+found??t [root@justin?home]#?ls justin??lost+found??mv [root@justin?home]#?mv?mv{,bak} [root@justin?home]#?ls justin??lost+found??mvbak [root@localhost?home]#?mv?justin1?/usr/local/src/ [root@localhost?home]#?ls justin??lost+found??t [root@localhost?home]#?cd?/usr/local/src/?&&?ls justin1??nagios??nagios1??nagios2??nagios-3.5.0.tar.gz [root@localhost?home]#?touch?justin1 [root@localhost?home]#?mv?-i?justin1?/usr/local/src/ mv:是否覆蓋"/usr/local/src/justin1"??y [root@justin?touch]#?ls file1??file2??file3??file4??file5 [root@justin?touch]#?mv?file1?file2?../mv/ [root@justin?touch]#?mv?file{3..4}?../mv/ [root@justin?touch]#?ls?../mv/ file1??file2??file3??file4 [root@justin?touch]#
last---顯示當前和過去用戶登陸的所有相關信息
last命令可以顯示指定賬戶或終端登錄用戶的相關信息。不帶參數的last命令顯示/var/log/wtmp文件中記錄的登錄用戶的清單。
[root@Zabbix_server?home]#?last justin???pts/1????????10.15.71.162?????Thu?Aug?28?13:44???still?logged?in??? justin???pts/1????????10.15.71.162?????Thu?Aug?28?13:31?-?13:44??(00:12)???? root?????pts/0????????10.15.71.162?????Tue?Aug?26?09:58???still?logged?in
當登陸系統用戶很多的時候,可以在W后面加上某個用戶名,則會查看該用戶執行任務的情況:[root@localhost ~]# last justin
pts 表示遠程連接的,tty表示console登陸的
-n<顯示行數>或-<顯示行數> ?設置列出名單的顯示行數。
-f file ?指定記錄文件,默認情況下last命令讀取/var/log/wtmp文件。
-t YYYYMMDDHHMMSS ?顯示指定時間為止的所有登錄信息,日期格式為年月日時分秒
[root@Zabbix_server?home]#?last?-t?20140828134000 justin???pts/1????????10.15.71.162?????Thu?Aug?28?13:31????gone?-?no?logout? root?????pts/0????????10.15.71.162?????Tue?Aug?26?09:58???still?logged?in
-R 不顯示登錄系統的主機名或IP地址。
-a ?在最后一列顯示登錄系統主機的主機名或IP地址。
-o ?讀取老格式的wtmp文件。
-x ?顯示登錄登出的記錄
[root@Zabbix_server?home]#?last?-5xa justin???pts/1????????Thu?Aug?28?13:44???still?logged?in????10.15.71.162 justin???pts/1????????Thu?Aug?28?13:31?-?13:44??(00:12)?????10.15.71.162 root?????pts/0????????Tue?Aug?26?09:58???still?logged?in????10.15.71.162 root?????pts/0????????Tue?Aug?26?09:57?-?09:58??(00:00)?????:0.0 root?????tty1?????????Tue?Aug?26?09:57???still?logged?in????:0 wtmp?begins?Wed?Jul?16?01:45:27?2014 [root@Zabbix_server?home]#
注:顯示特定的終端,可以用數字表示,如:last 0 ?===> last tty0
[root@Zabbix_server?home]#?last?1?-3 root?????tty1?????????:0???????????????Tue?Aug?26?09:57???still?logged?in??? root?????tty1?????????:0???????????????Mon?Aug?25?22:55?-?down???(00:01)???? root?????tty1?????????:0???????????????Thu?Aug?21?10:42?-?down???(03:45)???? wtmp?begins?Wed?Jul?16?01:45:27?2014 [root@Zabbix_server?home]#
lastb---顯示登陸失敗的信息
選項和last一樣
[root@Zabbix_server?home]#?lastb?-3a justin???ssh:notty????Thu?Aug?28?13:44?-?13:44??(00:00)?????10.15.71.162 justin???ssh:notty????Thu?Aug?28?13:44?-?13:44??(00:00)?????10.15.71.162 justin???ssh:notty????Thu?Aug?28?13:44?-?13:44??(00:00)?????10.15.71.162 btmp?begins?Tue?Aug??5?13:51:27?2014 [root@Zabbix_server?home]#?lastb?|?awk?'{?print?$3}'?|?awk?'{++S[$NF]}?END?{for(a?in?S)?print?a,?S[a]}'?|?sort?-rk2?|head????查看嘗試惡意登陸的前十個IP [root@Zabbix_server?home]#?lastb?|?awk?'{?print?$3}'?|?sort?|?uniq?-c?|?sort?-n????????????????查看惡意IP嘗試登陸次數
/var/log/wtmp 用于記錄登錄成功的用戶的信息,是一個二進制文件,只能通過 last 命令來查看
/var/log/btmp 用于記錄登錄失敗的用戶的信息,是一個二進制文件,只能通過 lastb 命令來查看
/var/log/lastlog 用于記錄用戶的歷史登錄情況,是一個二進制文件,只能通過 lastlog 命令來查看
/var/run/utmp 用于記錄當前登錄的用戶的信息,是一個二進制文件,只能通過 who 命令來查看
lastlog---顯示用戶最后登陸的相關信息
如果此用戶從來沒有登錄,則顯示:**Never?logged?in**
[root@Zabbix_server?home]#?lastlog? zabbix?????????????????????????????????????**Never?logged?in** justin???????????pts/1????10.15.71.162?????Thu?Aug?28?13:44:24?+0800?2014
-u 查詢指定uid的用戶登陸信息
[root@Zabbix_server?home]#?lastlog?-u?500 Username?????????Port?????From?????????????Latest zabbix?????????????????????????????????????**Never?logged?in** [root@Zabbix_server?home]#
whoami---顯示登陸名
[root@localhost?~]#?whoami root [root@localhost?~]#
users---只能列出當前登錄的用戶名
[root@justin?~]#?users root [root@justin?~]#
who---可以列出用戶名、終端、登錄時間、來源地點等信息
[root@justin?~]#?who root?????pts/0????????2013-10-22?17:34?(10.15.72.73) [root@justin?~]#
who -b 查看最后一次系統啟動的時間。
[root@localhost?~]#?who?-b ?????????system?boot??2016-03-17?10:11 [root@localhost?~]#
who -r 查看當前系統運行時間
[root@localhost?~]#?who?-r ?????????run-level?3??2016-05-24?08:41???????????????????last=S [root@localhost?~]#
last ?reboot ?可以看到Linux系統歷史啟動的時間
[root@localhost?~]#?last?reboot reboot???system?boot??2.6.32-431.el6.x?Thu?Mar?17?10:11?-?10:22??(00:11)???? reboot???system?boot??2.6.32-431.el6.x?Wed?Mar?16?12:48?-?10:22??(21:34)???? reboot???system?boot??2.6.32-431.el6.x?Tue?Mar?15?17:31?-?20:39??(03:07)???? reboot???system?boot??2.6.32-431.el6.x?Thu?Mar??3?13:50?-?15:19?(9+01:29)??? reboot???system?boot??2.6.32-431.el6.x?Mon?Feb??1?14:30?-?14:55??(00:24)???? reboot???system?boot??2.6.32-431.el6.x?Fri?Jan?29?10:24?-?14:55?(3+04:30)??? reboot???system?boot??2.6.32-431.el6.x?Mon?Dec?28?06:48?-?14:37?(2+07:49)??? reboot???system?boot??2.6.32-431.el6.x?Sat?Oct?10?23:08?-?15:56??(-7:-12)??? wtmp?begins?Sat?Oct?10?23:08:49?2015 [root@localhost?~]#?last?reboot|head?-1 reboot???system?boot??2.6.32-431.el6.x?Thu?Mar?17?10:11?-?10:25??(00:14)???? [root@localhost?~]#
uptime---列出用戶名、終端、來源地點、登錄時間、執行的命令等參數
[root@localhost?~]#?uptime? ?09:23:34?up?56?min,??2?users,??load?average:?0.00,?0.00,?0.00 [root@localhost?~]#
w---列出用戶名、終端、來源地點、登錄時間、執行的命令等參數
[root@justin?~]#?w ?19:51:03?up??2:19,??1?user,??load?average:?0.08,?0.02,?0.01 USER?????TTY??????FROM??????????????LOGIN@???IDLE???JCPU???PCPU?WHAT root?????pts/0????10.15.72.73??????17:34????0.00s??0.22s??0.01s?w [root@justin?~]#
USER:顯示登陸用戶帳號名。用戶重復登陸,該帳號也會重復出現。
TTY:用戶登陸所用的終端。
FROM:顯示用戶在何處登陸系統。
LOGIN@:是LOGIN AT的意思,表示登陸進入系統的時間。
IDLE:用戶空閑時間,從用戶上一次任務結束后,開始記時。
JCPU:一終端代號來區分,表示在某段時間內,所有與該終端相關的進程任務所耗費的CPU時間。
PCPU:指WHAT域的任務執行后耗費的CPU時間。
WHAT:表示當前執行的任務
當登陸系統用戶很多的時候,可以在W后面加上某個用戶名,則會查看該用戶執行任務的情況:[root@localhost ~]# w justin
想踢除justin這個用戶和他的所有開啟的程序
pkill -u justin
安全的做法是先查看終端號,然后查看該終端執行的所有進程,根據進程號來停止服務
安全剔除用戶
ps -ef| grep pts/0
得到用戶登錄相應的進程號pid后執行.
kill -9 pid
!!---執行最近一次的命令
[root@localhost?~]#?!! whoami root [root@localhost?~]#
du---統計目錄(或文件)所占磁盤空間的大小
-c或--total 除了顯示目錄或文件的大小外,同時也顯示所有目錄或文件的總和。
-a:全部文件與目錄大小都列出來。如果不加任何選項和參數只列出目錄(包含子目錄)大小。
-c:最后加總
-b:列出的值以bytes為單位輸出,默認是以Kbytes
-k:以KB為單位輸出
-m:以MB為單位輸出
-h或--human-readable 以K,M,G為單位,提高信息的可讀性。系統自動調節單位,例如文件太小可能就幾K,那么就以K為單位顯示,如果大到幾G,則就以G為單位顯示
-k或--kilobytes 以1024 bytes為單位。
-m或--megabytes 以1MB為單位
-s或--summarize 僅顯示總計,即當前目錄的大小。
[root@justin?~]#?du?-c?/mnt/lv1 16??/mnt/lv1/lost+found 44??/mnt/lv1 44??total [root@justin?~]#?du?-sh?/mnt/lv1 44K?/mnt/lv1 [root@justin?~]#?du?-shm?/mnt/lv1 1???/mnt/lv1 [root@justin?~]#?du?-shk?/mnt/lv1 44??/mnt/lv1 [root@justin?~]#
df---檢查linux服務器的文件系統的磁盤空間占用情況
-h 方便閱讀方式顯示
-i 顯示inode信息
-T 文件系統類型
[root@justin?~]#?df?-Th Filesystem????Type????Size??Used?Avail?Use%?Mounted?on /dev/sda2?????ext4????9.9G??2.4G??7.0G??26%?/ tmpfs????????tmpfs????504M?????0??504M???0%?/dev/shm /dev/sda1?????ext4????194M???26M??158M??15%?/boot /dev/sda5?????ext4????7.7G??146M??7.2G???2%?/home /dev/mapper/sdcvg-sdclv ??????????????ext4????4.0G??137M??3.7G???4%?/mnt/lv1 /dev/mapper/sdcvg-sdclv1 ??????????????ext4????4.0G???72M??3.7G???2%?/mnt/lv2 [root@justin?~]#
id---顯示用戶的ID,以及所屬群組的ID
[root@localhost?~]#?id?justin uid=500(justin)?gid=500(justin)?組=500(justin)
說明:id會顯示用戶以及所屬群組的實際與有效ID。若兩個ID相同,則僅顯示實際ID。若僅指定用戶名稱,則顯示目前用戶的ID。執行id時不添加參數是查看當前用戶的身份標識信息;gid”:表示的是用戶的基本組;“組”:表示的是用戶所屬的所有組,其中“組”中的第1個組賬號為該用戶的基本組,其他組賬號為該用戶的附屬組
file---查看文件類型
[root@justin?2.6.32-279.el6.i686]#?file?extra/ extra/:?directory [root@justin?2.6.32-279.el6.i686]#?file?modules.dep modules.dep:?ASCII?text,?with?very?long?lines [root@justin?2.6.32-279.el6.i686]#
Linux中文件類型不是按后綴名來定義,而是根據文件內容來判斷,即使后綴類似windows的.exe也可能只是文本文件
ln---為文件或目錄建立鏈接
-s---進行軟鏈結(symbolic link)
#為網卡建立軟連接wk [root@localhost?~]#?ln?-s?/etc/sysconfig/network-scripts/ifcfg-eth0?/root/wk [root@localhost?~]#?ls?-lh?/root/wk lrwxrwxrwx.?1?root?root?41?9月??23?15:55?/root/wk?->?/etc/sysconfig/network-scripts/ifcfg-eth0
說明:軟連接相當于window快捷方式,可以在wk里修改文件,刪除鏈接時,直接用rm命令:rm -f /root/wk
Linux/Unix 檔案系統中,有所謂的連結(link),我們可以將其視為檔案的別名,鏈接文件分為硬鏈接、軟鏈接兩種類型,主要區別是:不能對目錄創建硬鏈接,也不能跨越不同分區創建硬鏈接文件,而軟鏈接則沒有這些限制,所以平時使用的大都是軟鏈接。硬連結的意思是一個檔案可以有多個名稱,而軟連結的方式則是產生一個特殊的檔案,該檔案的內容是指向另一個檔案的位置。硬連結是存在同一個檔案系統中,而軟連結卻可以跨越不同的檔案系統。不論是硬連結或軟鏈結都不會將原本的檔案復制一份,只會占用非常少量的磁碟空間。
alias---設置命令別名
說明:命令別名通常是命令的縮寫,對于經常使用的命令,通過設置別名可以簡化操作,提高工作效率。
單獨執行alias命令可以列出當前系統中已經存在的別名命令。在執行這個命令時需要注意,“=”的兩邊不能有空格,在標準命令的兩端要使用單引號。
[root@localhost?~]#?alias?wk='/etc/sysconfig/network-scripts/ifcfg-eth0' [root@localhost?~]#?alias alias?cp='cp?-i' alias?l.='ls?-d?.*?--color=auto' alias?ll='ls?-l?--color=auto' alias?ls='ls?--color=auto' alias?mv='mv?-i' alias?rm='rm?-i' alias?which='alias?|?/usr/bin/which?--tty-only?--read-alias?--show-dot?--show-tilde' alias?wk='/etc/sysconfig/network-scripts/ifcfg-eth0' [root@localhost?~]#?unalias?wk [root@localhost?~]#?alias alias?cp='cp?-i' alias?l.='ls?-d?.*?--color=auto' alias?ll='ls?-l?--color=auto' alias?ls='ls?--color=auto' alias?mv='mv?-i' alias?rm='rm?-i' alias?which='alias?|?/usr/bin/which?--tty-only?--read-alias?--show-dot?--show-tilde' [root@localhost?~]#
設置別名也可以在文件/boot/.bashrc中設置
[root@localhost?~]#?vim?/root/.bashrc
用source命令在當前bash環境下讀取并執行bashrc中的命令,這樣我們自定義的命令就生效了
[root@localhost?~]#?source?.bashrc
date?
打印當前系統的時間
[root@localhost?~]#?date? Thu?Nov?13?07:36:28?CST?2014 [root@localhost?~]#?date?"+%y%m%d" 141113 [root@localhost?~]#?date?"+%Y%m%d" 20141113 [root@localhost?~]#?date?"+%Y%m%d?%H:%M:%S" 20141113?07:37:04 [root@localhost?~]#?date?-d?"+1?day"?"+%Y%m%d?%H:%M:%S" 20141114?07:37:31 [root@localhost?~]#?date?-d?"-1?month"?"+%Y%m%d?%H:%M:%S" 20141013?07:37:45 [root@localhost?~]#?date?-d?"-1?year"?"+%Y%m%d?%H:%M:%S?%w" 20131113?07:38:22?3 [root@localhost?~]#?date?"+%Y年%m月%d日?%H:%M:%S?星期%w" 2014年11月20日?13:39:17?星期4 [root@localhost?~]#?date?-d?"-5?month"?"+%Y年%m月%d日?%H:%M:%S?星期%w" 2014年06月20日?13:41:12?星期5 [root@Monitor?~]#?date?-d?"yesterday"?+"%Y%m%d" 20150917 [root@Monitor?~]#?rm?-rf?`date?-d?"today"?+"%Y%m%d"` [root@Monitor?~]#?mkdir?`date?-d?"today"?+"%Y%m%d"` [root@localhost?home]#?touch?`date?+%Y%m%d` [root@localhost?home]#?touch?file`date?+%Y%m%d`
%Y表示年(注意%y和%Y的區別),%m表示月,%d表示日期,%H表示小時,%M表示分鐘,%S表示秒,%w表示星期幾,-d?選項可以打印n天前或者n天后的日期,當然也可以打印n個月/年前或者后的日期。
給定的格式FORMAT 控制著輸出
? %a ? ?當前locale 的星期名縮寫(例如: 日,代表星期日)
? %A ? ?當前locale 的星期名全稱 (如:星期日)
? %b ? ?當前locale 的月名縮寫 (如:一,代表一月)
? %B ? ?當前locale 的月名全稱 (如:一月)
? %c ? ?當前locale 的日期和時間 (如:2005年3月3日 星期四 23:05:25)
? %C ? ?世紀;比如 %Y,通常為省略當前年份的后兩位數字(例如:20)
? %d ? ?按月計的日期(例如:01),不補0使用%-d
? %D ? ?按月計的日期;等于%m/%d/%y
? %e ? ?按月計的日期,添加空格,等于%_d
? %F ? ?完整日期格式,等價于 %Y-%m-%d
? %h ? ?等于%b
? %H ? ?小時(00-23)
? %I ? ?小時(00-12)
? %c ? ?按年計的日期(001-366)
? %k ? ?時(0-23)
? %l ? ?時(1-12)
? %m ? ?月份(01-12)
? %M ? ?分(00-59)
? %n ? ?換行
? %p ? ?當前locale 下的"上午"或者"下午",未知時輸出為空
? %P ? ?與%p 類似,但是輸出小寫字母
? %r ? ?當前locale 下的 12 小時時鐘時間 (如:11:11:04 下午)
? %R ? ?24 小時時間的時和分,等價于 %H:%M
? %s ? ?自UTC 時間 1970-01-01 00:00:00 以來所經過的秒數,時間戳
? %S ? ?秒(00-60)
? %t ? ?輸出制表符 Tab
? %T ? ?時間,等于%H:%M:%S
? %u ? ?星期,1 代表星期一
? %U ? ?一年中的第幾周,以周日為每星期第一天(00-53)
? %V ? ?ISO-8601 格式規范下的一年中第幾周,以周一為每星期第一天(01-53)
? %w ? ?一星期中的第幾日(0-6),0 代表周一
? %W ? ?一年中的第幾周,以周一為每星期第一天(00-53)
? %x ? ?當前locale 下的日期描述 (如:12/31/99)
? %X ? ?當前locale 下的時間描述 (如:23:13:48)
? %y ? ?年份最后兩位數位 (00-99)
? %Y ? ?年份
幾個日常比較常用的時間格式:
1. date +%A?? ??? ??? ?#顯示星期幾(英語,如Sunday)
2. date +%B?? ??? ??? ?#顯示月份(英語,如March)
3. date +%d?? ??? ??? ?#顯示目前是本月份第幾天
4. date +%F?? ??? ??? ?#顯示目前的年月日(格式如:2011-01-01)相當于:date +%Y-%m-%d
5. date +%Y?? ??? ??? ?#顯示目前年
6. date +%m?? ??? ??? ?#顯示當前是本年第幾個月
7. date +%H?? ??? ??? ?#示小時
8. date +%M?? ??? ??? ?#顯示分鐘
9.date? +%S?? ??? ??? ?#顯示秒數
10. date +%j?? ??? ?#本年第幾天(0-366)
11. date +%n?? ??? ?#換行
12. date +%t?? ??? ?#跳格
13. date +%T?? ??? ?#顯示24小時制時間,相當于date +%H:%M:%S,所以要顯示標準日期和時間可以如此寫: date +%F%t%T
14. date +%Y-%m-%d --date="+1 day"?? 以" +%Y-%m-%d"格式顯示“本日+1天”以后的日期,可以推算年和月,如下:--date="-1 day"??? --date="-a year"?? --date="-1 month"
15. date +%Y-%m-%d --reference="/home/uncle_cat/shahuhu"?? 以"+%Y-%m-%d "的日期格式列出"/home/uncle_cat/shahuhu" 這個文件的最后修改日期。
16. date --set="2011-01-01 16:51:54" 設定目前的日期為"2011-01-01 16:51:54"? ----請注意,此權限只有root用戶才有,一般用戶沒有的
設定時間
date -s //設置當前時間,只有root權限才能設置,其他只能查看。
date -s 20080523 //設置成20080523,這樣會把具體時間設置成空00:00:00
date -s 01:01:01 //設置具體時間,不會對日期做更改
date -s “01:01:01 2008-05-23″ //這樣可以設置全部時間
date -s “01:01:01 20080523″ //這樣可以設置全部時間
date -s “2008-05-23 01:01:01″ //這樣可以設置全部時間
date -s “20080523 01:01:01″ //這樣可以設置全部時間
加減
date +%Y%m%d???????? //顯示前天年月日
date +%Y%m%d --date="+1 day"? //顯示前一天的日期
date +%Y%m%d --date="-1 day"? //顯示后一天的日期
date +%Y%m%d --date="-1 month"? //顯示上一月的日期
date +%Y%m%d --date="+1 month"? //顯示下一月的日期
date +%Y%m%d --date="-1 year"? //顯示前一年的日期
date +%Y%m%d --date="+1 year"? //顯示下一年的日期
常用的日期獲取
date -d 'next monday' ?? ??? ?#下周一的日期
date -d? next-day +%Y%m%d?? ?#明天日期
date -d tomorrow +%Y%m%d ?? ?#明天日期
date -d last-day +%Y%m%d??? #昨天日期
date -d yesterday +%Y%m%d ?? ?#昨天日期
date -d last-month +%Y%m??? #上個月日期
date -d next-month +%Y%m??? #下個月日期
date -d next-year +%Y?????? #明年日期
date -d '2 weeks'?? ??? ??? ?#2周后
date -d '-2 weeks'?? ??? ??? ?#2周前
date -d "-1 weeks Nov 17, 2018"?? ??? ?#相對2018-11-17這個時間前一周的日期
時間戳轉換
[root@Super?~]#?date?-d?"2018-11-10"?+%s 1541779200 [root@Super?~]#
參數
-d<字符串>:顯示字符串所指的日期與時間。字符串前后必須加上雙引號;?
-s<字符串>:根據字符串來設置日期與時間。字符串前后必須加上雙引號;?
-u:顯示GMT;?
--help:在線幫助;?
--version:顯示版本信息。
[root@localhost?rename]#?date?-d?"1970-01-01?1234567890?seconds"?+"%Y-%m-%d?%H:%m:%S" 2009-02-13?23:02:30 [root@localhost?rename]#?date?-d?"2009-12-12"?+"%Y/%m/%d?%H:%M.%S" 2009/12/12?00:00.00 [root@localhost?rename]#?date?-d?"Dec?5,?2009?12:00:37?AM"?+"%Y-%m-%d?%H:%M.%S" 2009-12-05?00:00.37 [root@localhost?rename]#?date?-d?"Dec?5,?2009?12:00:37?AM?2?year?ago"?+"%Y-%m-%d?%H:%M.%S" 2007-12-05?00:00.37 [root@localhost?rename]#
設置系統所在的時區
[root@localhost?mpc-0.8.1]#?date?-R???#查看時區 Sat,?22?Jul?2017?09:39:08?+0800 [root@localhost?mpc-0.8.1]#?more?/etc/sysconfig/clock?|grep?-v?"#"?#查看clock系統配置文件 ZONE="Asia/Shanghai" UTC=true ARC=false [root@localhost?mpc-0.8.1]#?tzselect? #復制相應的時區文件,替換系統時區文件;或者創建鏈接文件 [root@localhost?mpc-0.8.1]#?cp?/usr/share/zoneinfo/Asia/Shanghai?/etc/localtime
tzselect命令只告訴你選擇的時區的寫法,并不會生效。所以現在它還不是東8區北京時間。你可以在.profile、.bash_profile或者/etc/profile中設置正確的TZ環境變量并導出。 例如在.bash_profile里面設置 TZ='Asia/Shanghai'; export TZ并使其生效。
[root@localhost?~]#?vim?/etc/profile TZ='Asia/Shanghai' export?TZ [root@localhost?~]#?source?/etc/profile
臨時修改系統時間
[root@localhost?remote]#?date Mon?Jan??2?12:34:11?CST?2017 [root@localhost?remote]#?date?-s?20161020 Thu?Oct?20?00:00:00?CST?2016 [root@localhost?remote]#?date?-s?10:23:14 Mon?Jan??2?10:23:14?CST?2017 [root@localhost?remote]#?date?-s?"20161020?10:23:14" Thu?Oct?20?10:23:14?CST?2016 [root@localhost?remote]#?date?-s?"10/21/2016?10:23:14" Fri?Oct?21?10:23:14?CST?2016 [root@localhost?remote]#
在系統啟動時,Linux操作系統將時間從CMOS中讀到系統時間變量中,以后修改時間通過修改系統時間實現。為了保持系統時間與CMOS時間的一致性,Linux每隔一段時間會將系統時間寫入CMOS。由于該同步是每隔一段時間(大約是11分鐘)進行的,在我們執行date -s后,如果馬上重起機器,修改時間就有可能沒有被寫入CMOS,這就是問題的原因。
硬件時間的設置,可以用hwclock或者clock命令。其中,clock和hwclock用法相近,只用一個就行,只不過clock命令除了支持x86硬件體系外,還支持Alpha硬件體系。//查看硬件時間可以是用hwclock,hwclock --show 或者hwclock -r
[root@localhost?remote]#?hwclock?--show Mon?02?Jan?2017?12:47:28?PM?CST??-0.232754?seconds [root@localhost?remote]#
系統時間和硬件時間的同步
以系統時間為基準,修改硬件時間
[root@localhost?remote]#?clock?-w
以硬件時間為基準,修改系統時間
[root@localhost?remote]#?hwclock?-s
hwclock參數可以通過--help獲取
[root@localhost?remote]#?hwclock?--help ??-r?|?--show?????????read?hardware?clock?and?print?result ???????--set??????????set?the?rtc?to?the?time?given?with?--date ??-s?|?--hctosys??????set?the?system?time?from?the?hardware?clock ??-w?|?--systohc??????set?the?hardware?clock?to?the?current?system?time ???????--systz????????set?the?system?time?based?on?the?current?timezone ???????--adjust???????adjust?the?rtc?to?account?for?systematic?drift?since ??????????????????????the?clock?was?last?set?or?adjusted
CST:中國標準時間(China Standard Time),這個解釋可能是針對RedHat Linux。
UTC:協調世界時,又稱世界標準時間,簡稱UTC,從英文國際時間/法文協調時間“Universal Time/Temps Cordonné”而來。
[root@localhost?~]#?cal ??????July?2017????? Su?Mo?Tu?We?Th?Fr?Sa ???????????????????1 ?2??3??4??5??6??7??8 ?9?10?11?12?13?14?15 16?17?18?19?20?21?22 23?24?25?26?27?28?29 30?31 [root@localhost?~]#
su、sudo命令
su命令是一個切換用戶的工具,將普通用戶切換到超級用戶下,也可以從超級用戶切換到普通用戶;
sudo被稱為受限制的su,也被稱為授權認證的su。他是允許系統管理員分配給普通用戶一些合理的“權利”,并且不需要普通用戶知道超級用戶密碼,就能讓他們執行一些只有超級用戶或其他特許用戶才能完成的任務,sudo執行命令的流程是:將當前用戶切換到超級用戶下,或切換到指定的用戶下,然后以超級用戶或其指定切換到的用戶身份執行命令,執行完成后,直接退回到當前用戶,而這一切的完成要通過sudo的配置文件/etc/sudoers來進行授權。sudo都提供了一個編輯該文件的命令:visudo來對該文件進行修改。強烈推薦使用該命令修改sudoers。因為它會幫你校驗文件配置是否正確,如果不正確,在保存退出時就會提示你哪段配置出錯的。?
例如:普通用戶justin對/etc/shadow沒有訪問權限
[justin@localhost?~]$?cat?/etc/shadow cat:?/etc/shadow:?權限不夠 [justin@localhost?~]$?who?am?i justin???pts/1????????2014-11-18?04:41?(10.15.24.142) [justin@localhost?~]$
執行visudo之后,可以看見缺省只有一條root的配置,我們在起下面加一條jutsin對/etc/shadow有訪問的權限:
[root@localhost?root]#?visudo? ?97?##?Allow?root?to?run?any?commands?anywhere ?98?root????ALL=(ALL)???????ALL ?99?justin??ALL=?/bin/cat?/etc/shadow? ?[root@localhost?root]#?su?-?justin [justin@localhost?~]$?sudo?cat?/etc/shadow [sudo]?password?for?justin:
執行這個命令后,需要輸入justin用戶的密碼,然后就可訪問文件內容了。在這里sudo使用時間戳文件來完成類似“檢票”的系統,當用戶輸入密碼后就獲得了一張默認存活期為5分鐘的“入場券”(默認值可以在編譯的時候改變)。超時以后,用戶必須重新輸入密碼才能查看文件內容。
如果每次都需要輸入密碼,那么某些自動調用超級權限的程序就會出現問題,此時可以通過下面的設置,讓普通用戶無需輸入密碼即可執行具有超級權限的程序。
justin??ALL=?NOPASSWD:?/bin/cat?/etc/shadow
如果要讓一個普通用戶justin具有超級用戶的所有權限,而又不想輸入超級用戶的密碼:
#justin??ALL=?NOPASSWD:?/bin/cat?/etc/shadow justin??ALL=(ALL)?NOPASSWD:?ALL
history---查看歷史記錄
在Linux下可通過history命令查看用戶所有的歷史操作記錄,同時shell命令操作記錄默認保存在用戶目錄下的.bash_history文件中,通過這個文件可以查詢shell命令的執行歷史,
#列出最近執行過的3條歷史命令 [root@localhost?~]#?history?3 15?wc?/etc/resolv.conf 16?wc?-l?/etc/passwd 17?history?3
在每一個執行過的shell命令行前均有一個編號,代表其在歷史列表中的序號。如果想重新執行其中某一條命令,可以采用“!序號”的格式。如“!16”就表示把第16條歷史命令重新執行一遍。!!?(連續兩個”!”),表示執行上一條指令;!字符串(字符串大于等于1),例如!ta,表示執行命令歷史中最近一次以ta為開頭的指令。
[root@localhost?~]#?!16 wc?-l?/etc/passwd 35?/etc/passwd
默認的history命令只能查看用戶歷史操作記錄,并不能區分每個用戶操作命令的時間,通過在/etc/bashrc文末加入以下四行內容讓history命令自動記錄所有shell命令的執行時間:
[root@localhost?~]#?history|tail?-5 ???89??history?|tail? ???90??history?|tail?-5 ???91??exit ???92??date ???93??history|tail?-5 [root@localhost?~]#?vim?/etc/bashrc? ?89?#HISTSIZE定義了history命令輸出的記錄總數 ?90?export?HISTSIZE=4000 ?91?#HISTTIMEFORMAT定義時間顯示格式,這里的格式與date命令后的“+"%F?%T"”是一致的的,HISTTIMEFORMA????作為history的時間變量將值傳遞給history命令 ?92?export?HISTTIMEFORMAT='%F?%T?`whoami`' :set?nu?? [root@localhost?~]#?source?/etc/bashrc? [root@localhost?~]#?history|tail?-5 ???94??2014-11-18?04:16:11vim?/etc/bashrc? ???95??2014-11-18?04:21:48history|tail?-5 ???96??2014-11-18?04:22:03source?/etc/bash ???97??2014-11-18?04:22:06source?/etc/bashrc? ???98??2014-11-18?04:22:10history|tail?-5 [root@localhost?~]#?date 2014年?11月?18日?星期二?04:22:17?CST [root@localhost?~]#
為了確保服務器的安全,可以實現詳細記錄登錄過系統的用戶、IP地址、shell命令以及詳細操作時間等,并將這些信息以文件的形式保存在一個安全的地方
將下面這段代碼添加到/etc/profile文件末尾中,即可實現上述功能
[root@localhost?~]#?vim?/etc/profile 79?#history ?80?USER_IP=`who?-u?am?i?2>/dev/null|?awk?'{print?$NF}'|sed?-e?'s/[()]//g'` ?81?HISTDIR=/usr/share/.history ?82?if?[?-z?$USER_IP?] ?83?then ?84?USER_IP=`hostname` ?85?fi ?86?if?[?!?-d?$HISTDIR?] ?87?then ?88?mkdir?-p?$HISTDIR ?89?chmod?777?$HISTDIR ?90?fi ?91?if?[?!?-d?$HISTDIR/${LOGNAME}?] ?92?then ?93?mkdir?-p?$HISTDIR/${LOGNAME} ?94?chmod?300?$HISTDIR/${LOGNAME} ?95?fi ?96?export?HISTSIZE=4000 ?97?DT=`date?+%Y%m%d_%H%M%S` ?98?export?HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.history.$DT" ?99?export?HISTTIMEFORMAT="[%Y.%m.%d?%H:%M:%S]" 100?chmod?600?$HISTDIR/${LOGNAME}/*.history*?2>/dev/null :wq? [root@localhost?~]#?source?/etc/profile [root@host16?~]#?tail?-3?/etc/bashrc? #?vim:ts=4:sw=4 export?HISTSIZE=4000 export?HISTTIMEFORMAT="%F?%T?`whoami`?`who?-u?am?i|awk?'{print?$NF}'|sed?'s/[()]//g'`?" [root@host16?~]#
這段代碼將每個用戶的shell命令執行歷史以文件的形式保存在/usr/share/.history目錄中,每個用戶一個文件夾,并且文件夾下的每個文件以IP地址加shell命令操作時間的格式命名。下面是user01用戶執行shell命令的歷史記錄文件,保存歷史命令的文件夾目錄要盡量隱蔽,避免被***發現后刪除。基本效果如下:
[root@localhost?~]#?cd?/usr/share/.history/ [root@localhost?.history]#?ll 總用量?8 d-wx------?2?justin?justin?4096?11月?18?04:36?justin d-wx------?2?root???root???4096?11月?18?04:36?root [root@localhost?.history]#?cd?justin/ [root@localhost?justin]#?ls?-la 總用量?12 d-wx------?2?justin?justin?4096?11月?18?04:36?. drwxrwxrwx?4?root???root???4096?11月?18?04:33?.. -rw-------?1?justin?justin???79?11月?18?04:36?10.15.24.142.history.20141118_043321 [root@localhost?justin]#?cat?10.15.24.142.history.20141118_043321? #1416256413 echo?$LANG #1416256445 cat?/proc/cpuinfo?|grep?ml|grep?flags|wc?-l [root@localhost?justin]#?cd?../root/ [root@localhost?root]#?ls?-al 總用量?12 d-wx------?2?root?root?4096?11月?18?04:36?. drwxrwxrwx?4?root?root?4096?11月?18?04:33?.. -rw-------?1?root?root??577?11月?18?04:36?10.15.24.142.history.20141118_043037 [root@localhost?root]#?cat?10.15.24.142.history.20141118_043037? #1416255336 date #1416255351 history|tail?-5 #1416255371 vim?/etc/bashrc? #1416255708 history|tail?-5 #1416255723 source?/etc/bash
shutdown---關閉或重啟系統
-r : 關機后重新開機
-h : 關機后停機
-t seconds : 設定在幾秒鐘之后進行關機程序
-c : 取消目前已經進行中的關機動作
-f : 關機時,不做 fcsk 動作(檢查 Linux 檔系統)
-F : 關機時,強迫進行 fsck 動作
#使用shutdown命令馬上重啟系統 [root@localhost?~]#?shutdown?–r?now??????????????????????????????? #使用shutdown命令馬上關閉系統 [root@localhost?~]#?shutdown?–h?now??????????????????????????????? #使用shutdown命令設置在15分鐘以后自動重啟系統 [root@localhost?~]#?shutdown?–r?+15
說明:
halt:馬上關閉系統
reboot:馬上重啟系統。
“init 0”:關閉系統
“init 6”:重啟系統
重定向
說明:Linux系統中標準的輸入設備為鍵盤,標準輸出設備為屏幕,但在某些情況下,我們希望能從鍵盤以外的其他輸入設備讀取數據,或者將數據送到屏幕外的其他輸出設備,這種情況稱為重定向。Shell中輸入輸出重定向主要依靠重定向符號來實現,重定向的目標通常是一個文件。
輸入重定向:輸入重定向就是將命令中接收輸入的途徑由默認的鍵盤重定向為指定的文件,需要使用“<”重定向操作符。如命令“wc < f1”就表示將f1文件的信息作為wc命令的輸入。
輸出重定向:輸出重定向是將命令的輸出結果重定向到一個文件中,而不是顯示在屏幕上。輸出重定向使用“>”或“>>”操作符,分別用于覆蓋、追加文件。“>”重定向符后面指定的文件如果不存在,在命令執行中將建立該文件,并保存命令結果到文件中。“>”重定向符后面指定的文件如果存在,命令執行時將清空文件的內容并保存命令結果到文件中。
#查看/etc/passwd文件的內容,并將輸出結果保存到pass.txt文件中。 [root@localhost?~]#?cat?/etc/passwd?>?pass.txt
執行該命令后,會在當前目錄下生成一個名為pass.txt的文件,文件中的內容就是“cat /etc/passwd”命令執行的結果。
“>>”重定向操作符可以將命令執行的結果重定向并追加到指定文件的末尾保存,而不覆蓋文件中原有的內容。
#查看/etc/shadow文件的后3行內容,并將輸出結果追加保存到pass.txt文件中。 [root@localhost?~]#?tail?-3?/etc/shadow?>>?pass.txt
使用重定向就不會輸出到屏幕,如果想同時輸出到屏幕和重定向到指定文件可以使用tee命令,
[root@localhost?test]#?tail?-5?/etc/passwd|tee?tee.txt rpcuser:x:29:29:RPC?Service?User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous?NFS?User:/var/lib/nfs:/sbin/nologin gdm:x:42:42::/var/lib/gdm:/sbin/nologin sshd:x:74:74:Privilege-separated?SSH:/var/empty/sshd:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin? [root@localhost?test]#?cat?tee.txt? rpcuser:x:29:29:RPC?Service?User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous?NFS?User:/var/lib/nfs:/sbin/nologin gdm:x:42:42::/var/lib/gdm:/sbin/nologin sshd:x:74:74:Privilege-separated?SSH:/var/empty/sshd:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin [root@localhost?test]#
tee--重定向到文件并打印到屏幕
[root@localhost?dir1]#?cat?/proc/cpuinfo?|grep?flags|grep?lm|wc?-l|tee?-a?cpuinfo.txt 2 [root@localhost?dir1]#?cat?cpuinfo.txt? 2 [root@localhost?dir1]#
默認tee為疊加,參數-a為追加
tr?:
替換字符,常用來處理文檔中出現的特殊符號,如DOS文檔中出現的^M符號。常用的選項有兩個:
-d?:刪除某個字符,-d?后面跟要刪除的字符
-s?:把重復的字符去掉
[root@localhost?test]#?cat?/etc/passwd|grep?^root root:x:0:0:root:/root:/bin/bash [root@localhost?test]#?cat?/etc/passwd|grep?^root|tr?'[a-z]'?'[A-Z]' ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH [root@localhost?test]#
wget
-O –output-document=FILE下載文件保存為別的文件名
[root@localhost?~]#?wget?-O?rinetd1.tar.gz?http://www.boutell.com/rinetd/http/rinetd.tar.gz
-c 斷點續傳
[root@localhost?~]#?wget?-cO?rinetd1.tar.gz
–limit -rate限速下載?
[root@localhost?~]#?wget?–limit-rate=300k?http://cn.wordpress.org/wordpress-3.1-zh_CN.zip
-b后臺下載?
–spider測試下載鏈接?
如果下載鏈接正確,將會顯示?
wget?–spider?URL? Spider?mode?enabled.?Check?if?remote?file?exists.? HTTP?request?sent,?awaiting?response…?200?OK? Length:?unspecified?[text/html]? Remote?file?exists?and?could?contain?further?links,? but?recursion?is?disabled?—?not?retrieving.
但當你給錯了一個鏈接,將會顯示如下錯誤?
wget?–spider?url? Spider?mode?enabled.?Check?if?remote?file?exists.? HTTP?request?sent,?awaiting?response…?404?Not?Found? Remote?file?does?not?exist?—?broken?link!!!
使用spider參數可以
定時下載之前進行檢查?
間隔檢測網站是否可用?
檢查網站頁面的死鏈接?
–tries增加重試次數?
wget –tries=40 URL?
-i下載多個文件?
[root@localhost?~]#?cat?>?filelist.txt? url1? url2? url3? url4? [root@localhost?~]#?wget?-i?filelist.txt? [root@localhost?~]#
–mirror鏡像網站?
wget –mirror -p –convert-links -P ./LOCAL URL?
–miror:開戶鏡像下載?
-p:下載所有為了html頁面顯示正常的文件?
–convert-links:下載后,轉換成本地的鏈接?
-P ./LOCAL:保存所有文件和目錄到本地指定目錄?
–reject過濾指定格式下載?
wget –reject=gif url?
-o把下載信息存入日志文件?
wget -o download.log URL?
-Q限制總下載文件大小?
wget -Q5m -i filelist.txt ? 下載的文件超過5M而退出下載
這個參數對單個文件下載不起作用,只能遞歸下載時才有效
-r -A下載指定格式文件?
wget -r -A.pdf url ??載一個網站的所有PDF文件?
?
FTP下載?
wget –ftp-user=USERNAME –ftp-password=PASSWORD url
啟動參數:
-V, –version 顯示wget的版本后退出
-h, –help 打印語法幫助
-b, –background 啟動后轉入后臺執行
-e, –execute=COMMAND 執行`.wgetrc’格式的命令,wgetrc格式參見/etc/wgetrc或~/.wgetrc
記錄和輸入文件參數:
-o, –output-file=FILE 把記錄寫到FILE文件中
-a, –append-output=FILE 把記錄追加到FILE文件中
-d, –debug 打印調試輸出
-q, –quiet 安靜模式(沒有輸出)
-v, –verbose 冗長模式(這是缺省設置)
-nv, –non-verbose 關掉冗長模式,但不是安靜模式
-i, –input-file=FILE 下載在FILE文件中出現的URLs
-F, –force-html 把輸入文件當作HTML格式文件對待
-B, –base=URL 將URL作為在-F -i參數指定的文件中出現的相對鏈接的前綴
–sslcertfile=FILE 可選客戶端證書
–sslcertkey=KEYFILE 可選客戶端證書的KEYFILE
–egd-file=FILE 指定EGD socket的文件名
下載參數:
–bind-address=ADDRESS 指定本地使用地址(主機名或IP,當本地有多個IP或名字時使用)
-t, –tries=NUMBER 設定最大嘗試鏈接次數(0 表示無限制).
-O –output-document=FILE 把文檔寫到FILE文件中
-nc, –no-clobber 不要覆蓋存在的文件或使用.#前綴
-c, –continue 接著下載沒下載完的文件
–progress=TYPE 設定進程條標記
-N, –timestamping 不要重新下載文件除非比本地文件新
-S, –server-response 打印服務器的回應
–spider 不下載任何東西
-T, –timeout=SECONDS 設定響應超時的秒數
-w, –wait=SECONDS 兩次嘗試之間間隔SECONDS秒
–waitretry=SECONDS 在重新鏈接之間等待1…SECONDS秒
–random-wait 在下載之間等待0…2*WAIT秒
-Y, –proxy=on/off 打開或關閉代理
-Q, –quota=NUMBER 設置下載的容量限制
–limit-rate=RATE 限定下載輸率
目錄參數:
-nd –no-directories 不創建目錄
-x, –force-directories 強制創建目錄
-nH, –no-host-directories 不創建主機目錄
-P, –directory-prefix=PREFIX 將文件保存到目錄 PREFIX/…
–cut-dirs=NUMBER 忽略 NUMBER層遠程目錄
HTTP 選項參數:
–http-user=USER 設定HTTP用戶名為 USER.
–http-passwd=PASS 設定http密碼為 PASS
-C, –cache=on/off 允許/不允許服務器端的數據緩存 (一般情況下允許)
-E, –html-extension 將所有text/html文檔以.html擴展名保存
–ignore-length 忽略 `Content-Length’頭域
–header=STRING 在headers中插入字符串 STRING
–proxy-user=USER 設定代理的用戶名為 USER
–proxy-passwd=PASS 設定代理的密碼為 PASS
–referer=URL 在HTTP請求中包含 `Referer: URL’頭
-s, –save-headers 保存HTTP頭到文件
-U, –user-agent=AGENT 設定代理的名稱為 AGENT而不是 Wget/VERSION
–no-http-keep-alive 關閉 HTTP活動鏈接 (永遠鏈接)
–cookies=off 不使用 cookies
–load-cookies=FILE 在開始會話前從文件 FILE中加載cookie
–save-cookies=FILE 在會話結束后將 cookies保存到 FILE文件中
FTP 選項參數:
-nr, –dont-remove-listing 不移走 `.listing’文件
-g, –glob=on/off 打開或關閉文件名的 globbing機制
–passive-ftp 使用被動傳輸模式 (缺省值).
–active-ftp 使用主動傳輸模式
–retr-symlinks 在遞歸的時候,將鏈接指向文件(而不是目錄)
遞歸下載參數:
-r, –recursive 遞歸下載--慎用!
-l, –level=NUMBER 最大遞歸深度 (inf 或 0 代表無窮)
–delete-after 在現在完畢后局部刪除文件
-k, –convert-links 轉換非相對鏈接為相對鏈接
-K, –backup-converted 在轉換文件X之前,將之備份為 X.orig
-m, –mirror 等價于 -r -N -l inf -nr
-p, –page-requisites 下載顯示HTML文件的所有圖片
遞歸下載中的包含和不包含(accept/reject):
-A, –accept=LIST 分號分隔的被接受擴展名的列表
-R, –reject=LIST 分號分隔的不被接受的擴展名的列表
-D, –domains=LIST 分號分隔的被接受域的列表
–exclude-domains=LIST 分號分隔的不被接受的域的列表
–follow-ftp 跟蹤HTML文檔中的FTP鏈接
–follow-tags=LIST 分號分隔的被跟蹤的HTML標簽的列表
-G, –ignore-tags=LIST 分號分隔的被忽略的HTML標簽的列表
-H, –span-hosts 當遞歸時轉到外部主機
-L, –relative 僅僅跟蹤相對鏈接
-I, –include-directories=LIST 允許目錄的列表
-X, –exclude-directories=LIST 不被包含目錄的列表
-np, –no-parent 不要追溯到父目錄
wget -S –spider url 不下載只顯示過程
| ? ? 管道
說明:管道符“|”用于連接左右兩個命令,將“|”左邊命令的執行結果作為“|”右邊命令的輸入,這樣“|”就像一根管道一樣連接著左右兩條命令,并在管道中實現數據從左至右的傳輸。默認從管道傳來的值是放在最后的
#分頁顯示/etc目錄下所有文件和子目錄的詳細信息。 [root@localhost?~]#?ls?-lh?/etc?|?more #顯示/etc目錄下包含有“net”關鍵字的所有文件和子目錄的詳細信息。 [root@localhost?~]#?ls?-lh?/etc?|?grep?net ?-rwxr-xr-x.?1?root?root?1.3K?4月?10?2012?auto.net ?-rw-r--r--.?1?root?root???74?5月?31?2012?issue.net ?-rw-r--r--.?1?root?root?767?11月?30?2009?netconfig ?-rw-r--r--.?1?root?root???58?5月?23?2012?networks ?drwxr-xr-x.?2?root?root?4.0K?1月???8?19:14?xinetd.d #統計一下/etc目錄下所有以“.conf”結尾的文件的個數。 [root@localhost?~]#?ls?-l?/etc/*.conf?|?wc?–l ?44???????????? #查看/etc/httpd/conf/httpd.conf文件中除了以“#”開頭的行和空行以外的內容。 [root@localhost?~]#?grep?-v?“^#”?/etc/httpd/conf/httpd.conf?|?gerp?–v?“^$”
&&
&&前面的命令成功執行后才能執行后面的命令,前面命令失敗則停止
[root@localhost?~]#?date?&&?printf?"The?date?command?was?succussful" 2013年?09月?23日?星期一?16:53:54?CST The?date?command?was?succussful [root@localhost?~]#?data?&&?printf?"The?date?command?was?succussful" -bash:?data:?command?not?found [root@localhost?~]#
||
有命令成功執行則停止執行后續命令,即使后續命令正確
[root@localhost?~]#?date?||?ls?-l 2013年?09月?23日?星期一?16:59:44?CST [root@localhost?~]#?date?&&?ls?-l 2013年?09月?23日?星期一?16:59:50?CST 總用量?96 -rw-------.?1?root?root??1357?9月??18?15:58?anaconda-ks.cfg -rw-r--r--.?1?root?root?43294?9月??18?15:58?install.log -rw-r--r--.?1?root?root?10151?9月??18?15:55?install.log.syslog lrwxrwxrwx.?1?root?root????41?9月??23?15:55?wk?->?/etc/sysconfig/network-scripts/ifcfg-eth0 drwxr-xr-x.?2?root?root??4096?9月??22?14:22?公共的 drwxr-xr-x.?2?root?root??4096?9月??22?14:22?模板 drwxr-xr-x.?2?root?root??4096?9月??22?14:22?視頻 drwxr-xr-x.?2?root?root??4096?9月??22?14:22?圖片 drwxr-xr-x.?2?root?root??4096?9月??22?14:22?文檔 drwxr-xr-x.?2?root?root??4096?9月??22?14:22?下載 drwxr-xr-x.?2?root?root??4096?9月??22?14:22?音樂 drwxr-xr-x.?2?root?root??4096?9月??22?14:22?桌面 [root@localhost?~]#
;??分號
平時我們都是在一行中敲一個命令,然后回車就運行了,那么想在一行中運行兩個或兩個以上的命令如何呢?則需要在命令之間加一個”;”了。
[root@localhost?test]#?echo?3444?>?1.txt?;cat?1.txt;ll?1.txt? 3444 -rw-r--r--?1?root?root?5?Nov??6?09:17?1.txt [root@localhost?test]#
& ?命令掛起;
把一條命令放到后臺執行的話,則需要加上這個符號。通常用于命令運行時間非常長的情況。使用jobs可以查看當前shell中后臺執行的任務。用fg可以調到前臺執行。這里的sleep命令就是休眠的意思,后面跟數字,單位為秒,想要把任務調到前臺執行的話,fg后面跟任務號,任務號可以使用jobs命令得到。
[root@localhost?test]#?sleep?100?& [1]?15556 [root@localhost?test]#?jobs [1]+??Running?????????????????sleep?100?& [root@localhost?test]#?fg?1 sleep?100
后臺作業管理
[root@localhost?rsync_server]#?jobs????#查看后臺作業 [1]-??Running?????????????????nohup?/bin/sh?/app/inotify/rsync.sh?>?/app/inotify/nohup.out?2>&1?& [2]+??Running?????????????????nohup?/bin/sh?/app/inotify/rsync.sh?& [root@localhost?rsync_server]#?fg?2????#將后臺作業2跳到前臺 nohup?/bin/sh?/app/inotify/rsync.sh ^Z????????????????????????????????????????#ctrl+z?將當前作業放到后臺“暫停” [2]+??Stopped?????????????????nohup?/bin/sh?/app/inotify/rsync.sh [root@localhost?rsync_server]#?jobs [1]-??Running?????????????????nohup?/bin/sh?/app/inotify/rsync.sh?>?/app/inotify/nohup.out?2>&1?& [2]+??Stopped?????????????????nohup?/bin/sh?/app/inotify/rsync.sh [root@localhost?rsync_server]#?jobs?-l????#列出作業PID [1]-?17938?Running?????????????????nohup?/bin/sh?/app/inotify/rsync.sh?>?/app/inotify/nohup.out?2>&1?& [2]+?18231?Stopped?????????????????nohup?/bin/sh?/app/inotify/rsync.sh [root@localhost?rsync_server]#?jobs?-r????#列出僅在后臺運行(run)的作業 [1]-??Running?????????????????nohup?/bin/sh?/app/inotify/rsync.sh?>?/app/inotify/nohup.out?2>&1?& [root@localhost?rsync_server]#?jobs?-s????#列出僅在后臺暫停的作業 [2]+??Stopped?????????????????nohup?/bin/sh?/app/inotify/rsync.sh [root@localhost?rsync_server]#?bg?2?#ctrl+z讓當前作業到后臺去暫停,bg?作業號就可以在后臺run [2]+?nohup?/bin/sh?/app/inotify/rsync.sh?& [root@localhost?rsync_server]#?jobs?-l [1]-?17938?Running?????????????????nohup?/bin/sh?/app/inotify/rsync.sh?>?/app/inotify/nohup.out?2>&1?& [2]+?18231?Running?????????????????nohup?/bin/sh?/app/inotify/rsync.sh?& [root@localhost?rsync_server]#?kill?-9?%2 [root@localhost?rsync_server]#?jobs?-l [1]-?17938?Running?????????????????nohup?/bin/sh?/app/inotify/rsync.sh?>?/app/inotify/nohup.out?2>&1?& [2]+?18231?Killed??????????????????nohup?/bin/sh?/app/inotify/rsync.sh [root@localhost?rsync_server]#
sleep: ??將目前動作延遲一段時間
sleep [--help] [--version] number[smhd]
其中 s 為秒,m 為 分鐘,h 為小時,d 為日數,默認是秒
顯示目前時間后延遲 1 分鐘,之后再次顯示時間 :?
[root@localhost?~]#?date;sleep?10;date Wed?Nov?12?01:43:47?CST?2014 Wed?Nov?12?01:43:57?CST?2014 [root@localhost?~]#
nohup?不掛斷地運行命令
Unix/Linux下多程序并不象mysqld一樣做成守護進程,可能我們的程序只是普通程序而已,一般這種程序使用& 結尾,但是如果終端關閉,那么程序也會被關閉。但是為了能夠后臺運行,那么我們就可以使用nohup和&命令,
語法:
????nohup Command [ Arg ... ] [ & ]
? ?eg、nohup ./filetransserver64 1>/dev/null 2>&1 &
提示:
[~]$ appending output to nohup.out
證明運行成功,同時把程序運行的輸出信息放到當前目錄的nohup.out 文件中去。
描述:
????nohup 命令運行由Command 參數和任何相關的Arg 參數指定的命令,忽略所有掛斷(SIGHUP)信號。在注銷后使用nohup 命令運行后臺中的程序。要運行后臺中的nohup 命令,添加& ( 表示“and”的符號)到命令的尾部。
注意:
????在當shell中提示了nohup成功后,還需要按終端上鍵盤任意鍵退回到shell輸入命令窗口,然后通過在shell中輸入exit來退出終端;如果在nohup執行成功后直接點關閉程序按鈕關閉終端的話,這時候會斷掉該命令所對應的session,導致nohup對應的進程被通知需要一起shutdown,起不到關掉終端后調用程序繼續后臺運行的作用。
1>/dev/null 2>&1的含義
shell中經常會用到這個命令。
1>/dev/null 首先表示標準輸出重定向到空設備文件,也就是不輸出任何信息到終端,說白了就是不顯示任何信息。
2>&1 接著,標準錯誤輸出重定向等同于 標準輸出,因為之前標準輸出已經重定向到了空設備文件,所以標準錯誤輸出也重定向到空設備文件。
/dev/null 代表空設備文件
> 代表重定向到哪里
在shell中,每個進程都和三個系統文件 相關聯:標準輸入stdin,標準輸出stdout、標準錯誤stderr,三個系統文件的文件描述符分別為0,1、2。
1 表示stdout標準輸出,系統默認值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr標準錯誤
0 是標準輸入,一般是鍵盤
& 表示等同于的意思,2>&1,表示2的輸出重定向等同于1
nohup ./filetransserver64 1>/dev/null 2>&1 & ?與?nohup ./filetransserver64 1>/dev/null 2>/dev/null &區別
nohup ./filetransserver64 1>/dev/null 2>&1 &?只使用了一個管道FD1,但已經包括了stdout和stderr。
nohup ./filetransserver64 1>/dev/null 2>/dev/null?相當于使用了FD1、FD2兩個互相競爭使用文件 /dev/null 的管道
從IO效率上來講nohup ./filetransserver64 1>/dev/null 2>&1 &的效率更高。為何2>&1要寫在后面?2>&1 標準錯誤拷貝了標準輸出的行為,但此時標準輸出還是在終端。>file 后輸出才被重定向到file,但標準錯誤仍然保持在終端。
bash ?的常用快捷鍵
刪除
ctrl + d ? ? ?刪除光標所在位置上的字符,相當于VIM里x或者dl
ctrl + h ? ? ?刪除光標所在位置前的一個字符,相當于VIM里hx或者dh
ctrl + k ? ? ?刪除光標后面所有字符,相當于VIM里d shift+$
ctrl + u ? ? ?刪除光標前面所有字符,相當于VIM里d shift+^
ctrl + w ? ? ?刪除光標前一個單詞,相當于VIM里db
ctrl + y ? ? ?恢復ctrl+u上次執行時刪除的字符
ctrl + ? ? ? ?撤消前一次輸入
移動
ctrl + a ? ? ?將光標移動到命令行開頭,相當于VIM里shift+^
ctrl + e ? ? ?將光標移動到命令行結尾處,相當于VIM里shift+$
ctrl + f ? ? ?光標向后移動一個字符,相當于VIM里l
ctrl + b ? ? ?光標向前移動一個字符,相當于VIM里h
ctrl + 方向鍵左鍵 ? ?光標移動到前一個單詞開頭
ctrl + 方向鍵右鍵 ? ?光標移動到后一個單詞結尾
ctrl + x ? ? ? 在上次光標所在字符和當前光標所在字符之間跳轉
alt ?+ f ? ? ?跳到光標所在位置單詞尾部
替換
ctrl + t ? ? ? 將光標當前字符與前面一個字符替換
alt ?+ t ? ? 交換兩個光標當前所處位置單詞和光標前一個單詞
alt ?+ u ? ? 把光標當前位置單詞變為大寫
alt ?+ l ? ? ?把光標當前位置單詞變為小寫
alt ?+ c ? ? ?把光標當前位置單詞頭一個字母變為大寫
^oldstr^newstr ? ?替換前一次命令中字符串 ??
歷史命令編輯
ctrl + p ? 返回上一次輸入命令字符
ctrl + r ? ? ? 輸入單詞搜索歷史命令
alt ?+ p ? ? 輸入字符查找與字符相接近的歷史命令
alt ?+ > ? ? 返回上一次執行命令
其它
ctrl + s ? ? ?鎖住終端
ctrl + q ? ? ?解鎖終端
ctrl + l ? ? ? ?清屏相當于命令clear
ctrl + c ? ? ? 另起一行
ctrl + i ? ? ? 類似TAB健補全功能
ctrl + o ? ? ?重復執行命令
alt ?+ 數字鍵 ?操作的次數
EOF?
在shell編程中,”EOF“通常與”<<“結合使用,“<<EOF“表示后續的輸入作為子命令或子shell的輸入,直到遇到”EOF“,再次返回到主調shell,形式如下:
交互式程序(命令)<<EOF command1 command2 ... EOF
? ?”EOF“中間的內容將以標準輸入的形式輸入到”交互式程序“,當shell看到”<<“知道其后面輸入的分界符,當shell再次看到分界符時,兩個分界符中間的部分將作為標準輸入。"EOF"一般常和cat命令連用。注意,最后的”EOF“必須單獨占一行。
#!/bin/bash su?-?oracle?<<?EOF salplus?/?as?sysdba startup exit EOF
變量
變量,說簡單點就是使用一個較簡單的字符串來替代某些具有特殊意義的設定以及數據。通常shell預設的變量都是大寫的。
使用env命令可全部列出系統預設的全部環境變量,可以使用set命令把系統預設的全部變量都顯示出來。常見的環境變量:
PATH 決定了shell將到哪些目錄中尋找命令或程序
HOME 當前用戶主目錄
HISTSIZE 歷史記錄數
LOGNAME 當前用戶的登錄名
HOSTNAME 指主機的名稱
SHELL 前用戶Shell類型
LANG 語言相關的環境變量,多語言可以修改此環境變量
MAIL 當前用戶的郵件存放目錄
PWD 當前目錄
使用bash命令即可再打開一個新的shell。用戶自定義的變量要被其他用戶使用或者新shell中使用需要添加到配置文件/etc/profile或$HOME/.bashrc文件最后一行加入自定義變量,然后運行”source /etc/profile”將當前的配置刷新。
在linux下設置自定義變量規則:
a.?設定變量的格式為”a=b”,其中a為變量名,b為變量的內容,等號兩邊不能有空格;
b.?變量名只能由英、數字以及下劃線組成,而且不能以數字開頭;
c.?當變量內容帶有特殊字符(如空格)時,需要加上單引號;如果變量內容中本身帶有單引號,這就需要用到雙引號了。
[root@localhost?~]#?myname=a?long bash:?long:?command?not?found [root@localhost?~]#?myname='a?long' [root@localhost?~]#?echo?$myname a?long [root@localhost?~]#?myname1="a'long" [root@localhost?~]#?echo?$myname1 a'long [root@localhost?~]#
d.?如果變量內容中需要用到其他命令運行結果則可以使用反引號(鍵盤上Tab鍵上面);
[root@localhost?~]#?currentpath=`pwd` [root@localhost?~]#?echo?$currentpath /root [root@localhost?~]#
e.?變量內容可以累加其他變量的內容,需要加雙引號;
[root@localhost?~]#?s1=`pwd` [root@localhost?~]#?echo?$s1 /root [root@localhost?~]#?s2="$s1"ss [root@localhost?~]#?echo?$s2 /rootss [root@localhost?~]#?a1="$MAIL"root [root@localhost?~]#?echo?$a1 /var/spool/mail/rootroot [root@localhost?~]#
用雙引號時不會取消掉里面出現的特殊字符的本身作用(這里的$),而使用單引號則里面的特殊字符全部失去它本身的作用。
如果在當前shell中運行bash指令后,則會進入一個新的shell,這個shell就是原來shell的子shell,在父shell中設定一個變量后,進入子shell后該變量是不會生效的,如果想讓這個變量在子shell中生效則要用到export指令,如果export后面不加任何變量名,則它會聲明所有的變量。
f.取消已設變量
[root@localhost?~]#?s2="$s1"ss [root@localhost?~]#?echo?$s2 /rootss [root@localhost?~]#?unset?s2 [root@localhost?~]#?echo?$s2 [root@localhost?~]#
擴展:
調用命令執行結果做為參數使用反引號(tab鍵上面鍵)
[root@localhost?redis-3.0.0]#?cd [root@localhost?~]#?pwd /root [root@localhost?~]#?cd?`find?/usr/local/src/?-name?"redis*"?-type?d` [root@localhost?redis-3.0.0]#?pwd /usr/local/src/redis-3.0.0 [root@localhost?redis-3.0.0]#
basename????返回一個字符串參數的基本文件名稱。
basename String [ Suffix ]
basename 命令讀取 String 參數,刪除以 /(斜杠) 結尾的前綴以及任何指定的 Suffix 參數,并將剩余的基本文件名稱寫至標準輸出。
dirname,它與basename相反,是取得目錄部分
[root@localhost?usr]#?dirname?/usr/local/src /usr/local [root@localhost?usr]#?dirname?/usr/local/src/ /usr/local [root@localhost?usr]#?basename?/usr/local/src/ src [root@localhost?usr]#?basename?/usr/local/src src [root@localhost?usr]#
系統環境變量與個人環境變量的配置文件
全局變量配置文件
/etc/profile?:這個文件預設了幾個重要的變量,例如PATH, USER, LOGNAME, MAIL, INPUTRC, HOSTNAME, HISTSIZE, umas等等。
/etc/bashrc?:這個文件主要預設umask以及PS1。這個PS1就是我們在敲命令時,前面那串字符了,例如筆者的linux系統PS1就是?[root@localhost ~]#?,你不妨看一下PS1的值:echo $PS1。
局部變量配置文件
.bash_profile?:定義了用戶的個人化路徑與環境變量的文件名稱。每個用戶都可使用該文件輸入專用于自己使用的shell信息,當用戶登錄時,該文件僅僅執行一次。
.bashrc?:該文件包含專用于你的shell的bash信息,當登錄時以及每次打開新的shell時,該該文件被讀取。例如你可以將用戶自定義的alias或者自定義變量寫到這個文件中。
.bash_history?:記錄命令歷史用的。
.bash_logout?:當退出shell時,會執行該文件。可以把一些清理的工作放到這個文件中。
Linux系統變量PATH在系統中的主要作用是,提供命令的搜索路徑
查看PATH變量:
[root@Zabbix_server?~]#?echo?$PATH /usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin [root@Zabbix_server?~]#
這就是系統命令搜索的所有路徑,如果哪天自己寫了一些shell腳本,那怎么才能把自己的腳本路徑放進PATH變量中的?假定腳本在”/home/script.sh?/home/script/script1.sh”,使該腳本能在其他目錄下也能執行
直接用export命令添加到PATH變量中---只對當前shell有效:
[root@Zabbix_server?script]#?export?PATH=/home/:$PATH [root@Zabbix_server?script]#?export?PATH=$PATH:/home/script [root@Zabbix_server?script]#?echo?$PATH /home/:/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/home/script [root@Zabbix_server?script]#?cd? [root@Zabbix_server?~]#?script.sh? /home/script.sh?all|none [root@Zabbix_server?~]#?script1.sh?all none [root@Zabbix_server?~]#
兩種添加方式后的位置不通,同時設置多個目錄用冒號隔開,這樣就可以在任意位置使用腳本
修改.bash文件添加到PATH變量中---重啟不丟失
[root@Zabbix_server?~]#?vim?/root/.bashrc? #?.bashrc #?User?specific?aliases?and?functions alias?rm='rm?-i' alias?cp='cp?-i' alias?mv='mv?-i' #?Source?global?definitions if?[?-f?/etc/bashrc?];?then ????????.?/etc/bashrc fi export?PATH="$PATH:/home" export?PATH="/home/script:$PATH" [root@Zabbix_server?~]#?source?/root/.bashrc
不建議修改/etc/profile,因為這樣的設置將對所有用戶的shell都生效,對系統安全會產生影響。
~/.bash_profile ?或者 ?~./bashrc ?對當前用戶有用
Linux命令的返回值
?????????????$? 是顯示最后命令的退出狀態,0表示沒有錯誤,其他表示有錯誤
在 Linux 下,不管你是啟動一個桌面程序也好,還是在控制臺下運行命令,所有的程序在結束時,都會返回一個數字值,這個值叫做返回值,或者稱為錯誤號 ( Error Number )。在控制臺下,環境變量 $?保存著前一個程序的返回值.
[root@localhost?~]#?ll?111 -rw-r--r--?1?root?root?10?Jan?30?11:23?111 [root@localhost?~]#?echo?$? 0 [root@localhost?~]#?ll?222 ls:?cannot?access?222:?No?such?file?or?directory [root@localhost?~]#?echo?$? 2 [root@localhost?~]#
只要返回值是 0,就代表程序執行成功了,如果 $? 變量的值不是 0 的話,就表示上一個命令在執行的過程中出錯了。
如果要每次執行完都顯示該值,執行export PS1="[\$?]${PS1}",這個命令把 $? 的值放在的提示符的最前面
[root@localhost?~]#?export?PS1="[\$?]${PS1}" [0][root@localhost?~]#?ll?111 -rw-r--r--?1?root?root?10?Jan?30?11:23?111 [0][root@localhost?~]#?ll?222 ls:?cannot?access?222:?No?such?file?or?directory [2][root@localhost?~]#
那么如果返回的值不是 0,可以用 perror 這個程序來查看錯誤的信息,perror命令是MySQL數據庫系統中的一個工具程序,在沒有安裝MySQL的機器上就無法執行
[2][root@localhost?~]#?perror?2 -bash:?perror:?command?not?found [127][root@localhost?~]#?yum?-y?install?mysql?mysql-server [0][root@localhost?~]#?perror?2 OS?error?code???2:??No?such?file?or?directory [0][root@localhost?~]#?perror?127 OS?error?code?127:??Key?has?expired MySQL?error?code?127:?Record?file?is?crashed [0][root@localhost?~]#
$$ Shell本身的PID(ProcessID)
$! Shell最后運行的后臺Process的PID
$- 使用Set命令設定的Flag一覽
$# 是傳給腳本的參數個數
$0 是腳本本身的名字
$1 是傳遞給該shell腳本的第一個參數
$2 是傳遞給該shell腳本的第二個參數
$$ 是腳本運行的當前進程ID號
$@ 是傳給腳本的所有參數的列表
$* 是以一個單字符串顯示所有向腳本傳遞的參數,與位置變量不同,參數可超過9個
[root@localhost?~]#?cat?test.sh? #!/bin/bash echo?"參數個數\$#:$#" echo?"腳本本身的名字\$0:$0" echo?"腳本的第一個參數\$1:$1" echo?"腳本的第二個參數\$2:$2" echo?"傳給腳本的所有參數的列表\$@:$@" echo?"字符串顯示所有向腳本傳遞的參數\$*:$*" echo?"腳本運行的當前進程ID號\$$:$$" echo?"退出狀態,0表示沒有錯誤,其他表示有錯誤\$?:$??" [root@localhost?~]#?./test.sh?1?2?3?4?5?6?7?8?9?10?11?12 參數個數$#:12 腳本本身的名字$0:./test.sh 腳本的第一個參數$1:1 腳本的第二個參數$2:2 傳給腳本的所有參數的列表$@:1?2?3?4?5?6?7?8?9?10?11?12 字符串顯示所有向腳本傳遞的參數$*:1?2?3?4?5?6?7?8?9?10?11?12 腳本運行的當前進程ID號$$:3933 退出狀態,0表示沒有錯誤,其他表示有錯誤$?:0? [root@localhost?~]#
區別:$@和$*
相同點:都是引用所有參數
不同點:只有在雙引號中體現出來。假設在腳本運行時寫了三個參數(分別存儲在112 3)則"3)則"*" 等價于 “112 3"(傳遞了一個參數);而“3"(傳遞了一個參數);而“@" 等價于 "1""1""2" "$3"(傳遞了三個參數)
BashShell的extglob選項
連接
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。