Linux export
shell會提供一組環(huán)境變量。export可新增,修改或刪除環(huán)境變量,供后續(xù)執(zhí)行的程序使用。export的效力僅及于該次登陸操作。
當我們退出登錄或者關(guān)閉終端再重新打開時,這個環(huán)境變量就會消失。是臨時的。
如果要添加對所有用戶生效的永久性變量(系統(tǒng)級)
修改/etc/profile
對單一用戶生效的永久性變量(用戶級)
修改~/.bash_profile
語法
export [-fnp][變量名稱]=[變量設置值]
參數(shù)說明:
-f 代表[變量名稱]中為函數(shù)名稱。
-n 刪除指定的變量。變量實際上并未刪除,只是不會輸出到后續(xù)指令的執(zhí)行環(huán)境中。
-p 列出所有的shell賦予程序的環(huán)境變量。
export F=a //增加F環(huán)境變量
export F=b //增加F環(huán)境變量為b
$F //獲取環(huán)境變量F
at 定時任務
在一個指定的時間執(zhí)行一個指定任務,只能執(zhí)行一次。首先在終端運行at命令,將計劃時間作為選項傳遞給它。然后它提示您輸入要在計劃時間運行的命令(或一系列命令)。完成后按Control-D,您的命令將被放入隊列中。
at 9:30 PM Tue
at> echo "Well gosh golly, it's 9:30 PM on Sunday."
at> ^D
job 1 at Sun Nov 16 09:30:00 2014
echo "ls -l >> t.log " | at 07:00
參考:https://stackoverflow.com/questions/18945669/how-to-run-a-script-at-a-certain-time-on-linux
It then places us at the at> prompt. Here we type in a simple echo command, which echoes a string of text. We press enter, and we're placed at a new at> prompt. We then press Control-D, telling at we're all done with our commands. It then tells us that our job is job number 1 and that it will run next Tuesday.
up.sh改變s.sh (當前bash腳本)的變量無效
at -f ./up.sh now + 1 minutes
up.sh從s.sh (當前bash腳本)會立即執(zhí)行
at -f . ./up.sh now + 1 minutes
命令參數(shù):
-m 當指定的任務被完成之后,將給用戶發(fā)送郵件,即使沒有標準輸出
-I atq的別名
-d atrm的別名
-v 顯示任務將被執(zhí)行的時間
-c 打印任務的內(nèi)容到標準輸出
-V 顯示版本信息
-q<列隊> 使用指定的列隊
-f<文件> 從指定文件讀入任務而不是從標準輸入讀入
-t<時間參數(shù)> 以時間參數(shù)的形式提交要運行的任務
參考:https://www.computerhope.com/unix/uat.htm
https://blog.csdn.net/gxiaop/article/details/55101020
here document
Here Document 是在Linux Shell 中的一種特殊的重定向方式,它的基本的形式如下
cmd << delimiter
Here Document Content
delimiter
它的作用就是將兩個 delimiter 之間的內(nèi)容(Here Document Content 部分) 傳遞給cmd 作為輸入?yún)?shù)。
比如在終端中輸入cat << EOF ,系統(tǒng)會提示繼續(xù)進行輸入,輸入多行信息再輸入EOF,中間輸入的信息將會顯示在屏幕上。如下:
fish@mangos:~$ cat << EOF
> First Line
> Second Line
> Third Line EOF
> EOF
First Line
Second Line
Third Line EOF
注: >這個符號是終端產(chǎn)生的提示輸入信息的標識符
這里要注意幾點
EOF 只是一個標識而已,可以替換成任意的合法字符
作為結(jié)尾的delimiter一定要頂格寫,前面不能有任何字符
作為結(jié)尾的delimiter后面也不能有任何的字符(包括空格)
作為起始的delimiter前后的空格會被省略掉
Here Document 不僅可以在終端上使用,在shell 文件中也可以使用,例如下面的here.sh 文件
cat << EOF > output.sh
echo "hello"
echo "world"
EOF
使用 sh here.sh 運行這個腳本文件,會得到output.sh 這個新文件,里面的內(nèi)容如下
echo "hello"
echo "world"
參考:https://blog.csdn.net/shixiaoguo90/article/details/49781971
https://www.tldp.org/LDP/abs/html/here-docs.html
here string
here string可以看成是here document的一種定制形式. 除了COMMAND <<<WORD, 就什么都沒有了,WORD將被擴展并且被送入COMMAND的stdin中.
As a simple example, consider this alternative to the echo-grep construction.
if echo "$VAR" | grep -q txt # if [[ $VAR = *txt* ]]
# etc.
# Try:
if grep -q "txt" <<< "$VAR"
then # ^^^
echo "$VAR contains the substring sequence \"txt\""
fi
Or, in combination with read:
read -r -a Words <<< "$String"
# The -a option to "read"
#+ assigns the resulting values to successive members of an array.
echo "First word in String is: ${Words[0]}" # This
echo "Second word in String is: ${Words[1]}" # is
echo "Third word in String is: ${Words[2]}" # a
echo "Fourth word in String is: ${Words[3]}" # string
echo "Fifth word in String is: ${Words[4]}" # of
echo "Sixth word in String is: ${Words[5]}" # words.
echo "Seventh word in String is: ${Words[6]}" # (null)
# Past end of $String.
參考:https://www.tldp.org/LDP/abs/html/x17837.html
linux 創(chuàng)建文件
vi
vi 1.txt 會直接創(chuàng)建并打開一個文件1.txt
touch
touch的作用是更改一個文件或目錄的時間。touch 2.txt 如果2.txt不存在,則創(chuàng)建空文件2.txt
echo
echo “abcd” > 3.txt 可以直接創(chuàng)建文件3.txt并將abcd寫入。
參考:https://blog.csdn.net/xyw_blog/article/details/16861263
linux 查看文件內(nèi)容的命令
cat 由第一行開始顯示檔案內(nèi)容
tac 從最后一行開始顯示,可以看出 tac 是 cat 的倒著寫!
more 一頁一頁的顯示檔案內(nèi)容
less 與 more 類似,但是比 more 更好的是,他可以往前翻頁!
head 只看頭幾行
tail 只看尾巴幾行
tail -f filename 會把 filename 文件里的最尾部的內(nèi)容顯示在屏幕上,并且不斷刷新,只要 filename 更新就可以看到最新的文件內(nèi)容。
nl 顯示的時候,順道輸出 行號!
od 以二進制的方式讀取檔案內(nèi)容!
把cat file 當做變量,varFile的命名如果為f.var,就什么都不會打印出來。f.var改成f.txt就可以??赡苁呛缶Y名稱不支持。 echo "inside(cat $varFile)"
rmdir刪除空目錄
- Linux mv命令用來為文件或目錄改名、或?qū)⑽募蚰夸浺迫肫渌恢谩?br>
mv 文件名 文件名 將源文件名改為目標文件名
mv 文件名 目錄名 將文件移動到目標目錄
mv 目錄名 目錄名 目標目錄已存在,將源目錄移動到目標目錄;目標目錄不存在則改名
mv 目錄名 文件名 出錯
將文件 aaa 更名為 bbb :
mv aaa bbb
將info目錄放入logs目錄中。注意,如果logs目錄不存在,則該命令將info改名為logs。
mv info/ logs
rm命令用于刪除一個文件或者目錄
rm [options] name...
參數(shù):
-i 刪除前逐一詢問確認。
-f 即使原檔案屬性設為唯讀,亦直接刪除,無需逐一確認。
-r 將目錄及以下之檔案亦逐一刪除。
清空文件夾
rm -rf /path/to/directory/*
刪除文件的內(nèi)容
filename
cat /dev/null > filename
cp /dev/null filename
3.mkdir命令用于建立名稱為 dirName 之子目錄。
mkdir [-p] dirName
在工作目錄下的 BBB 目錄中,建立一個名為 Test 的子目錄。 若 BBB 目錄原本不存在,則建立一個。(注:本例若不加 -p,且原本 BBB目錄不存在,則產(chǎn)生錯誤。)
mkdir -p BBB/Test
vi刪除多行
dd 刪除一行
d刪除以當前字符開始的一行字符 ndd 刪除以當前行開始的n行 dw 刪除以當前字符開始的一個字 ndw 刪除以當前字符開始的n個字 D 與d同義
d) 刪除到下一句的開始
d} 刪除到下一段的開始
d回車 刪除2行
ps
Linux ps命令用于顯示當前進程 (process) 的狀態(tài)。
ps -A 顯示進程信息
ps -u root //顯示root進程用戶信息
ps -ef //顯示所有命令,連帶命令行
ps -x 顯示沒有控制終端的進程,同時顯示各個命令的具體路徑。(守護進程)
pgrep命令以名稱為依據(jù)從運行進程隊列中查找進程,并顯示查找到的進程id。
pgrep inotify
查看守護進程
ps -eo 'tty,pid,comm' | grep ^?
參考:https://unix.stackexchange.com/questions/175380/how-to-list-all-running-daemons
kill
Linux kill命令用于刪除執(zhí)行中的程序或工作。
殺死進程
kill 12345
強制殺死進程
kill -KILL 123456
徹底殺死進程
kill -9 123456
改進pkill和killall:
看到pkill想到了什么?沒錯pgrep和kill!pkill=pgrep+kill。
pkill -9 firefox
killall和pkill是相似的,不過如果給出的進程名不完整,killall會報錯。pkill或者pgrep只要給出進程名的一部分就可以終止進程。
killall -9 firefox
守護進程
圖下所示為使用ps命令查看Linux系統(tǒng)進程的情況。從圖中可以看到守護進程的一些特點:所有的守護進程都是以超級用戶啟動的(UID為0);沒有控制終端(TTY為?);終端進程組ID為-1(TPGID表示終端進程組ID,該值表示與控制終端相關(guān)的前臺進程組,如果未和任何終端相關(guān),其值為?1)。
所有的守護進程的父進程都為init進程(PID為1的進程),如圖8.2所示??梢允褂胮stree命令列出Linux系統(tǒng)中進程樹的結(jié)構(gòu)來進行驗證。
參考:https://blog.csdn.net/u012317833/article/details/39342389
4.rsync
參考:https://wiki.archlinux.org/index.php/Rsync_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
http://man.linuxde.net/rsync
http://roclinux.cn/?p=2643
參數(shù):
--v 詳細模式輸出。
-q, --quiet 精簡輸出模式。
-a, --archive 歸檔模式,表示以遞歸方式傳輸文件,并保持所有文件屬性,等于-rlptgoD。
-r, --recursive 對子目錄以遞歸模式處理。
-R, --relative 使用相對路徑信息。
-l, --links 保留軟鏈結(jié)。
-L, --copy-links 想對待常規(guī)文件一樣處理軟鏈結(jié)。
--copy-unsafe-links 僅僅拷貝指向SRC路徑目錄樹以外的鏈結(jié)。
--safe-links 忽略指向SRC路徑目錄樹以外的鏈結(jié)。
-H, --hard-links 保留硬鏈結(jié)。
-p, --perms 保持文件權(quán)限。
-o, --owner 保持文件屬主信息。
-g, --group 保持文件屬組信息。
-D, --devices 保持設備文件信息。
-t, --times 保持文件時間信息。
--existing 僅僅更新那些已經(jīng)存在于DST的文件,而不備份那些新創(chuàng)建的文件。
--delete 刪除那些DST中SRC沒有的文件。
--partial 保留那些因故沒有完全傳輸?shù)奈募?,以是加快隨后的再次傳輸。
--force 強制刪除目錄,即使不為空。
--timeout=time ip超時時間,單位為秒。
-I, --ignore-times 不跳過那些有同樣的時間和長度的文件。
-P 等同于 --partial。
--progress 顯示備份過程。
-z, --compress 對備份的文件在傳輸時進行壓縮處理。
--exclude=PATTERN 指定排除不需要傳輸?shù)奈募J健?br>
--include=PATTERN 指定不排除而需要傳輸?shù)奈募J健?br>
--exclude-from=FILE 排除FILE中指定模式的文件。
--include-from=FILE 不排除FILE指定模式匹配的文件。
--version 打印版本信息。
--config=FILE 指定其他的配置文件,不使用默認的rsyncd.conf文件。
--port=PORT 指定其他的rsync服務端口。
--blocking-io 對遠程shell使用阻塞IO。
-stats 給出某些文件的傳輸狀態(tài)。
--progress 在傳輸時現(xiàn)實傳輸過程。
--log-format=formAT 指定日志文件格式。
--password-file=FILE 從FILE中得到密碼。
--bwlimit=KBPS 限制I/O帶寬,KBytes per second。
-h, --help 顯示幫助信息。</pre>
rsync 可以作為 cp 命令的高級替代品,特別在復制較大的文件的場景中:
rsync -P source destination 其中 -P 與 --partial --progress 選項的作用是相同的,該選項使得文件可以分塊傳輸并顯示傳輸過程中的進度。 您可能需要使用 -r --recursive 選項使目錄被遞歸地傳輸。 通過 cp 命令,可以本地復制文件,但 rsync 令人激動的一個特性是可以遠程復制文件,例如,在兩個不同的主機之間。遠程位置可以用主機加冒號進行指定: rsync source host:destination
或者
$ rsync host:source destination
網(wǎng)絡文件傳輸默認使用SSH協(xié)議。
注意尾隨下劃
Arch 默認使用 GNU cp (part of GNU coreutils). 然而,rsync 遵循 BSD cp 的約定, 源目錄后面帶有一個斜杠“/”有著特定的處理。比如:
$ rsync -r source destination
創(chuàng)建一個有著 "source"內(nèi)容的 "destination/source"目錄,命令:
rsync -r source/ destination 把"source/"目錄下的所有文件全部復制到"destination"目錄下,而沒有中間的子目錄 - 就像你調(diào)用了: rsync -r source/. destination
vi操作
u 撤銷上一步的操作
Ctrl+r 恢復上一步被撤銷的操作
Vim快速移動光標至行首和行尾
需要按行快速移動光標時,可以使用鍵盤上的編輯鍵Home,快速將光標移動至當前行的行首。除此之外,也可以在命令模式中使用快捷鍵"^"(即Shift+6)或0(數(shù)字0)。
如果要快速移動光標至當前行的行尾,可以使用編輯鍵End。也可以在命令模式中使用快捷鍵""(Shift+4)。 與快捷鍵"^"和0不同,快捷鍵""前可以加上數(shù)字表示移動的行數(shù)。例如使用"1"表示當前行的行尾,"2"表示當前行的下一行的行尾。
vim一個文件,如果不正常退出,再次編輯時是會提示一些信息的,并且有一個隱藏的文件.xxx.swp
swp先產(chǎn)生,如果swp存在就產(chǎn)生第二個swx。
參考:https://www.codetd.com/article/1020806
Shell 注釋
以"#"開頭的行就是注釋,會被解釋器忽略。
sh里沒有多行注釋,只能每一行加一個#號。只能像這樣:
多行注釋
多行注釋還可以使用以下格式:
:<<EOF
注釋內(nèi)容...
注釋內(nèi)容...
注釋內(nèi)容...
EOF
EOF 也可以使用其他符號:
:<<'
注釋內(nèi)容...
注釋內(nèi)容...
注釋內(nèi)容...
'
:<<!
注釋內(nèi)容...
注釋內(nèi)容...
注釋內(nèi)容...
!
linux系統(tǒng)目錄:
/bin:
bin是Binary的縮寫, 這個目錄存放著最經(jīng)常使用的命令。比如/bin/sh
/dev :
dev是Device(設備)的縮寫, 該目錄下存放的是Linux的外部設備。比如/dev/null 表示不存在的設備
/home:
用戶的主目錄,在Linux中,每個用戶都有一個自己的目錄,一般該目錄名是以用戶的賬號命名的。
/opt:
這是給主機額外安裝軟件所擺放的目錄。比如你安裝一個ORACLE數(shù)據(jù)庫則就可以放到這個目錄下。默認是空的。
/root:
該目錄為系統(tǒng)管理員,也稱作超級權(quán)限者的用戶主目錄。
/usr:
這是一個非常重要的目錄,用戶的很多應用程序和文件都放在這個目錄下,類似于windows下的program files目錄。
/usr/bin:
系統(tǒng)用戶使用的應用程序。
/var:
這個目錄中存放著在不斷擴充著的東西,我們習慣將那些經(jīng)常被修改的目錄放在這個目錄下。包括各種日志文件。
linux日志文件
/var/log/message 系統(tǒng)啟動后的信息和錯誤日志,是Red Hat Linux中最常用的日志之一
/var/log/secure 與安全相關(guān)的日志信息
/var/log/maillog 與郵件相關(guān)的日志信息
/var/log/cron 與定時任務相關(guān)的日志信息
/var/log/spooler 與UUCP和news設備相關(guān)的日志信息
/var/log/boot.log 守護進程啟動和停止相關(guān)的日志消息
linux 布爾類型
linux沒有布爾類型,可以轉(zhuǎn)成字符再比較
first=true
# ...do something interesting...
if [ "$first" = true ] ; then
echo 'Be careful not to fall off!'
fi
if [ "first" = true ] 中=左右必須有空格,否則報錯command is not found
重新設置變量
first=false
拼接字符串
greeting="hello, "first" !" greeting_1="hello,{first} !"
查找子字符串
查找字符 i 或 o 的位置(哪個字母先出現(xiàn)就計算哪個):
string="runoob is a great site"
echo expr index "$string" io # 輸出 4
提取子字符串
從字符串第 2 個字符開始截取 4 個字符:
string="runoob is a great site"
echo ${string:1:4} # 輸出 unoo
linux中 vi / vim顯示行號或取消行號命令
顯示行號
:set number
或者
:set nu
取消行號顯示
:set nu!
每次打開都顯示行號
修改vi ~/.vimrc 文件,添加:set number
參考:https://www.cnblogs.com/davidwang456/p/3895251.html
linux shell日期賦值給一個變量
d=(date +%Y-%m-%d) echo "d"
字符串查找
有個version.json文件,取出當前的版本號
{"prev":{"version":10080,"build_timestamp":1523500949,"value":"1523500949_10080"},"version":10081,"build_timestamp":1523504202,"value":"1523504202_10081"}
grep -Po ","version":(\d+)" .json -o | cut -d: -f2
或者用sed
echo '{"prev":{"version":10080,"build_timestamp":1523500949,"value":"1523500949_10080"},"version":10081,"build_timestamp":1523504202,"value":"1523504202_10081"}' | sed -n 's/."version":([0-9]+).*/\1/p'
grep 命令
-c 或 --count : 計算符合樣式的列數(shù)。
-C<顯示行數(shù)> 或 --context=<顯示行數(shù)>或-<顯示行數(shù)> : 除了顯示符合樣式的那一行之外,并顯示該行之前后的內(nèi)容。
-d <動作> 或 --directories=<動作> : 當指定要查找的是目錄而非文件時,必須使用這項參數(shù),否則grep指令將回報信息并停止動作。
-e<范本樣式> 或 --regexp=<范本樣式> : 指定字符串做為查找文件內(nèi)容的樣式。
-E 或 --extended-regexp : 將樣式為延伸的普通表示法來使用。
-l 或 --file-with-matches : 列出文件內(nèi)容符合指定的樣式的文件名稱。
-L 或 --files-without-match : 列出文件內(nèi)容不符合指定的樣式的文件名稱。
-n 或 --line-number : 在顯示符合樣式的那一行之前,標示出該行的列數(shù)編號。
-i 忽略字符大小寫的差別。
-o 只輸出文件中匹配到的部分。
-P perl正則表達式
在當前目錄中,查找后綴有 file 字樣的文件中包含 test 字符串的文件,并打印出該字符串的行。此時,可以使用如下命令:
grep test *file
cut 命令
Linux cut命令用于顯示每行從開頭算起 num1 到 num2 的文字。
語法
cut [-bn] [file]
cut [-c] [file]
cut [-df] [file]
使用說明:
cut 命令從文件的每一行剪切字節(jié)、字符和字段并將這些字節(jié)、字符和字段寫至標準輸出。
如果不指定 File 參數(shù),cut 命令將讀取標準輸入。必須指定 -b、-c 或 -f 標志之一。
參數(shù):
-b :以字節(jié)為單位進行分割。這些字節(jié)位置將忽略多字節(jié)字符邊界,除非也指定了 -n 標志。
-c :以字符為單位進行分割。
-d :自定義分隔符,默認為制表符。
-f :與-d一起使用,指定顯示哪個區(qū)域。
-n :取消分割多字節(jié)字符。僅和 -b 標志一起使用。如果字符的最后一個字節(jié)落在由 -b 標志的 List 參數(shù)指示的范圍之內(nèi),該字符將被寫出;否則,該字符將被排除
參考:https://stackoverflow.com/questions/8602848/grep-group-capturing
