Linux相關
/proc/$PID
:表示進程的文件/dev/null
:垃圾箱,黑洞
shell內部構造
- 變量:變量分爲:局部變量,環境變量,shell變量。
- shell變量:一部分是局部變量,一部分是環境變量,對shell很重要。比如:
IFS
,PS1
是局部shell變量 - 環境變量使用
export
進行導出,環境變量可以讓子進程繼承
- shell變量:一部分是局部變量,一部分是環境變量,對shell很重要。比如:
.bashrc
:在每次創建bash進程時會執行一次- 標準輸入輸出以及對應的文件描述符:
stdin-0
,stdout-1
,stderr-2
。
bash
特殊符號總結
反引號
:子shell,若要獲得值,直接var=`command`
即可。單引號
:字符串,原樣雙引號
:字符串,支持轉義字符和變量[]
:算術運算[[]]
:是[]
在用作條件運算時的擴展{}
:將變量和周圍的字符串隔離開來,如echo "some strange ${Java}Script"
()
- 子shell:
(ls)
或var=$(ls)
- 數組:
array=(1 2 3)
- 子shell:
(())
:算術運算$
:表示取出變量的內容,直接取出變量的值相當於執行命令var=(expr 3 + 4); $var;
語句格式
#
:註釋:
:空語句- 一般語句沒有分號要求
變量
- 聲明:等號前後不能有空格:
var="acc"
- 讀取:
echo ${var}
- 刪除變量:
unset var
- 只讀變量
字符串
- 單引號:原樣打印:
var='test_acc'
- 雙引號:計算變量:
acc="aod ${var}"
- 獲得字符串長度:
echo ${#var}
- 單個字符查找:需要藉助
expr
:echo `expr index ${var} char`
- 子串:
echo ${str:start:length}
- 還有很多字符串操作,截取等
# ## % %%
數組
- 數組元素可以爲空,元素類型可以不同
- 定義數組
array_1=(1 2 3); # 整體 array_2[1]=23; # 分開來 array_3=( # 支持換行 1 2 )
- 數組操作
- 獲得某個元素:
echo ${array[index]}
- 獲得所有元素:
echo ${array[*/@]}
。 - 獲得元素數量:
echo ${#array[*/@]}
- 獲取所有索引:
echo ${!array[*/@]}
。(對於散列數組很有用)
- 獲得某個元素:
- 關聯(散列)數組:需要先聲明
declare -A array_hash array_hash=([a]=aa [b]=bb); array_hash[c]=cc;
運算
- 算術運算:不推薦使用原生算術運算
- 算術運算:子shell + 命令的方法。(expr必須有嚴格的空格,因爲空格區分參數)
var=$(expr 5 + 4); var=`expr 5 + 4`
- 整數關係運算:只能用於判斷語句中,空格要求
-eq
,-ne
,gt
,lt
,ge
,le
,-a
,-o
if [[ 23 -eq 24 -o 24 -eq 34 ]]; ...
- 字符關係運算
=
,!=
,-z
,-n
if [[ "acc" = "bibi" ]]; ...
- 文件關係運算符
- 是否存在,是否是符號連接,是否是目錄,是否是塊設備,等等等
- 可以使用
test
指令進行判斷,可用於if
中
命令參數
$x
特殊變量。可用於終端,腳本,函數- - - - - - $0
名稱 $n
參數 $$
PID $#
參數數量 $*
所有參數 $@
所有參數 $?
退出狀態
函數
- 一般格式,可以不用換行
[function] func_name[()] { action; [return int;] }
條件控制
- if
if [[ $(ps -ef | grep -c "sh") -gt 1 ]]; then echo "sh than 1"; elif [[ $(ps -ef | grep -c "sh") -lt 1 ]]; then echo "sh not than 1"; fi
- case:採用模式進行匹配,使用
;;
作爲終止,使用*
作爲默認。用於字符串模式匹配時,不要引號case $name in *saku*) echo "1"; ;; *) echo "2"; ;; esac
循環控制
- for
for var in item1 ... itemN; do action; done
- while,支持
break
與continue
while condition; do action; done
- until
until condition; do action; done
輸入輸出重定向
n>
,n<
:將一個文件重定向到另一個文件。n
表示文件描述符
,0
是stdin,1
是stdout,2
是stderr>>
表示將輸出追加到文件末尾n>& m
表示將輸出文件n
合併到輸出文件m
。兩者都是文件描述符
- 當使用
command > file
時實際發生了:command
輸出到stdout
,stdout
重定向到file
|
:管道運算符:將標準輸出重新作爲標準輸入<<tag
:表示將標記之間的內容作爲輸入
# 將stderr合併到stdout,將stdout輸出到文件中。順序不能改變
ls + . > file 2>&1;
# 將stdout輸出到file1,將stderr輸出到file2
ls + . >file1 2>file2;
# 將整個作爲grep命令的輸入,可以理解爲替代管道符號 |
grep s <<!
not s
yes
is s
!
文件包含
. file
或source file
:將文件包含到當前文件中。
#命令
*/bin命令
tr
:替換字符串:cat /proc/$PID/environ | tr "\0" "\n"
tee
:將標準輸入一方面輸入到文件,另一方面到標準輸出echo "string" | tee file1.txt file2.txt | cat
sort
:對行進行排序sort file.txt; cat file.txt | sort;
cat
:讀取顯示文件。# 拼接標準輸入 echo "some text" | cat - file; echo "some text" | cat /dev/stdin file;
echo
:printf
:用法同C語言
pgrep
:得到符合模式字符串的PID
expr
- 四則運算(
+
,-
,\*
,/
,%
,=
)只支持整數。注:乘號需要轉義 - 比較運算(
==
,!=
)還支持字符串
- 四則運算(
read
:獲取鍵盤輸入,可以直接將結果存在變量中:read result
find
:會遞歸尋找給定目錄下的所有文件find . \( -name "*.sh" -o -name "*.py" \) -print
xargs
:可用於將標準輸入的內容格式化
;也可用於將標準輸入作爲命令的參數
;echo "/dev" | xargs ls; # v echo "/dev" | ls; # x
md5sum
:文件校驗和split
:文件分割
bash內命令
alias
unalias
:別名。別名是暫時的,可以將操作追加到.bashrc
使別名在每個終端生效。echo 'alias install="sudo apt install"' >> ~.bashrc