BigBrother的大数据之旅 Day 4 Linux(4)
學習目標:
1 bash編程
Shell 圖形化和命令行兩種,一個用戶一旦登錄就默認打開 /bin/bash
查看/etc/passwd最后一列就是用戶打開的那個程序,/bin/bash 或者 nolgin
1.1 pstree命令
? Linux pstree命令將所有行程以樹狀圖顯示,樹狀圖將會以 pid (如果有指定) 或是以 init 為根
? 通過ssh鏈接后敲入改命令的結果如下:
? 通過本機敲入該命令的結果如下:
1.2 bash
? Bash 是一個與 sh 兼容的命令解釋程序,可以執行從標準輸入或者文件中讀取的命令(解釋器),是許多Linux發行版的默認Shell(啟動器).
? 通俗地講,用命令行和linux交換的界面就是一個bash(可能不太準確哦),有解釋器和啟動器的功能.
? (1) source 命令 和 . 命令+文件
? 從當前bash執行命令或者腳本
? (2) bash命令 或者文件自己執行(./文件)
? 從子bash執行命令(重新打開一個bash)
bash -x 文件 ,可以查看程序執行過程(debug)
? bash -n 文件,檢查是否有語法錯誤
下面的test1中寫的為echo $$和pstree
2 文件重定向
2.1 fd
? 一個 Linux 進程啟動后,會在內核空間中創建一個 PCB 控制塊,PCB 內部有一個文件描述符表(File descriptor table),記錄著當前進程所有可用的文件描述符,也即當前進程所有打開的文件。
| 0 | stdin | 標準輸入文件 | 鍵盤 |
| 1 | stdout | 標準輸出文件 | 顯示器 |
| 2 | stderr | 標準錯誤輸出文件 | 顯示器 |
? 0,1,2比較特殊,代表著標準輸入(鍵盤),標準輸出(顯示器)和錯誤輸出(顯示器)。一般指向于當前shell的終端,(包含輸入輸出設備).如果是本機的話是tty,ssh鏈接的話,指向的是ptsx(虛擬終端,x為數字,一般從0開始).他們都指向于dev下的設備文件.誰讓linux中一切皆文件呢.
下圖為ssh登錄
下圖為本地登錄
? 下面是每個進程的fd指向于文件表,但是實際的文件在節點表中,如果重定向就是把fd到文件表的指針指向其他地方.
補充: 同一個進程的不同文件描述符可以指向同一個文件;
不同進程可以擁有相同的文件描述符;
不同進程的同一個文件描述符可以指向不同的文件(一般也是這樣,除了 0、1、2 這三個特殊的文件);
不同進程的不同文件描述符也可以指向同一個文件
2.2 輸出重定向
? 重定向不是命令
? 示例 /目錄下不存在/abb目錄下面是各種輸出重定向
? ls / 1>1.out : 把根目錄下的list信息輸出到1.out文件中
? ls /abb 2>2.out:把錯誤信息重定向到2.out文件中
? ls / /abb 1>3.out 2>4.out 把兩種信息重定向到不同文件
? ls / /abb 1>5.out 2>5.out 不能重定向到同一個文件,會覆蓋優先輸入的信息,該命令會覆蓋錯誤信息,文件中只有/目錄的 信息
? ls / /abb 1>6.out 2>&1 把1信息重定向到6.out 把錯誤信息重定向到1,不會覆蓋
? 簡單寫法為 ls / /abb &>7.out 或者 ls / /abb >& 7.out
? tips: > 前面沒有空格,除了上面的&> 或者 >&的寫法
2.3 輸入重定向
? <<< : 讀取字符串 – read aad <<< “hello shell” 然后 echo $aad , 結果為hello shell
? <<結束符: read aad<<EX 從鍵盤輸入一些數據,遇到EX結束,第一行為aad的內容
? < : 讀取文件: cat 0</etc/passwd
? tips: wc -l </etc/passwd : 查看passwd文件有多少行
3 shell編程
3.1 shell變量
環境變量:作用域為當前shell進程及其子進程;
export VARNAME=VALUE
VARNAME=VALUE
export VARNAME “導出”
查看本地環境變量: env命令
Q:為什么每個用戶都可以使用 JAVA_HOME?
A:是因為每次用戶登錄進來后,都會啟動~/.bashrc的文件,把變量export當前shell
本地變量
屬于當前bash ,比如LANG=zh_CN.UTF-8,如果輸入這個只是給當前bash設置了,其他沒有設置,再啟另一個,發現沒有改變LANG的值
set VARNAME=VALUE: 作用域為整個bash進程;
局部變量(local) 雖然叫local其實是局部變量
屬于一個函數
sxt(){
echo “sxt1”
local bbb =hello
}
local VARNAME=VALUE:作用域為當前代碼段;
特殊變量:
$?: 上一個命令的執行狀態返回值;
程序執行,可能有兩類返回值:
? 0: 正確執行
? 1-255:錯誤執行,1,2,127系統預留;
$#:位置參數個數
$*:參數列表,雙引號引用為一個字符串
$@:參數列表,雙引號引用為單獨的字符串
$ $ (兩個 $ 之間沒有空格啊): 腳本運行時的當前進程的ID號,有時候會作為臨時變量的后綴,haison.$$
位置變量:(文件和函數中使用)
$1,$2…
vim a.test
echo $1
echo $2
執行文件 source a.test a b
屏幕的結果為 a 回車 b
其他
管道| 管道命令會開啟一個新的子bash,子bash會繼承父bash里面的變量的值在其他情況下不會,需要export一下
?引用:
–雙引號:弱引用,參數擴展 ,把引號中的變量進行替換
–單引號:強引用,不可嵌套,把引號中所有類容當成字符串
-翻引號: `` 命令替換當成命令去執行
–花括號擴展不能被引用
–命令執行前刪除引用:加轉義字符
3.2 shell 流程控制
(1) (())和let
(2) [ ] 和 test
test -a + 文件 : 判斷文件是否存在
test -d + 目錄或文件: 判斷對象是否是目錄
test 3 -gt 2 : 判斷3 是否大于2 等價于 [ 3 -gt 2 ] – 記得3,2 前后都有空格哦
test 3 -lt 8: 判斷3是否小于8 等價于 [ 3 -lt 8 ]
test 3 -le 3:判斷3是否小于等于3
ps: 這些結果可以用 echo $? 查看命令的結果,本身沒有任何輸出
[ -e 文件] :測試文件是否存在
[ -f 文件] :測試文件是否是普通文件
[ -d 目錄] :測試文件是否是目錄
[ -n string ] : 判斷字符串是否為空
[ -s string ] : 判斷字符串是否不空
== ,!= 等號兩端需要空格
(2.5補充) 表達式
a: [ expression ] – 使用 -a 進行邏輯與 ,使用 -o 進行邏輯或*
? 例如 if [ $# -gt 1 -a $# -lt 3 -o $# -eq 2 ];
b: test expression
c: 任何一個命令都可以作為條件表達式
其實就是(2)中的內容多了最下面的一條
(3) 創建用戶的腳本
#! /bin/bash
useradd $1
echo $1 | passwd --stdin $1 – 設置與用戶名相同的密碼
echo “add user successfully”
(4) 控制語句
if ;then;else;fi
if test 3 -gt 2;then echo ok;else echo ook;fi – 如果3大于2,就輸出ok,不大于輸出ook
for((;; ));do;done – (())里面的東東和java中類似,不用-gt -lt等直接用> <等就行
for((a=1;a<5;a++));do echo $a;done echo"haha" – 輸出1-5的數字,最后輸出haha
加強for循環 for in 1 2 3 4 5;do echo $i;done
輸出1-5的最簡單的寫法為 seq 5
while(());do;done 和for一樣的 也可以 寫為 while [ ];do;done [ ]中寫條件 這里就需要寫成-gt的格式了
ps: set ts = 4 設置tab為4個字符
case 語句
case 變量 in
value1)
語句
;;
value2)
語句
;;
*) – 默認(其他情況)
語句
;;
esac
tips: /dev/null 為"黑洞文件"可以把輸出重定向"吃掉" 如 echo “ha” > /dev/null
shadow文件: 加密密碼后的第一個數字為用戶創建時間,距離1970年的天數,密碼最小使用天數,密碼最大使用天數,密碼距離最大使用天數前多少天進行警告.
(5)算數運算符
a: let 算數運算符表達式
? let c=$ A+$ B
b: $[算術表達式]
? C = $ [$ A+$ B]
c: $((算術表達式))
? C=$ (($ A+$B))
d:expr 算術表達式1、
注意:表達式中各操作數及運算符之間要有空格。而且要使用命令引用
? C = expr $A+$B
(6)函數
函數的定義
function 函數名(){
}
1 function可以省略,()不能省略,
2小括號中不能定義參數
3 函數體中可以定義函數,叫嵌套函數
4 函數體中可以寫return,只能返回0-255之間的數字,代表當前函數的執行狀態,如果沒有retrun,執行狀態為最后一行命令的狀態
函數的調用
函數名就行,不要寫小括號
給函數進行傳遞參數, 例如test(){
? echo $1
}
函數調用test 100,如果在腳本中寫,函數不能直接獲取從鍵盤中輸入的值
vim /etc/inittab
0 關閉模式
1 單機
2 無網絡
3 默認為3的,完整模式
4 自定義
5 圖形化界面
6 重啟
chkconifg 345 10 90 :在3,4,5級別上啟用,10啟動的優先級 越小越優先,一般調整到比較靠后的比如99,90為關閉的優先級
chkconfig tomcat on 加入開機
chkconifg --list 查看列表
參考文章:
1 關于fd(這篇文章寫得很好)
http://c.biancheng.net/view/3066.html
總結
以上是生活随笔為你收集整理的BigBrother的大数据之旅 Day 4 Linux(4)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker - 配置国内加速器加速镜像
- 下一篇: 又倒在了税务上,难道真的是抵不住“金钱”