shell編程筆記,shell編程
1.Bash變數
使用者定義變數 #局部變數
環境變數 #全域變數
位置參數變數
預定義變數
x=val #賦值
$x #調用
變數預設為字元型,不能直接運算
"$x" ${x} 變數疊加,即字串
set #查看系統所有變數
-u 當變數不存在時報錯
unset #清空變數
pstree #查看進程樹
export x #把x變成環境變數
PATH="$PATH":/root
PS1變數
\d 顯示日期 "星期 月 日"
\H 顯示完整主機名稱
\t "HH:MM:SS"
\A "HH:MM"
\u 目前使用者名
\w 當前所在目錄的完整名稱
\W 當前所在目錄的最後一個目錄
\$ 提示符
語系變數
echo $LANG #當前語系環境
locale -a | more #所有語系環境
/etc/sysconfig/i18n #預設語系環境,下次開機啟用
位置參數變數
$n n為數字,$0表示命令本身,$1-$9表示第一到第九個參數,十個以上的${10}
$* 代表命令列中所有的參數,一個整體
$@ 命令列所有參數,分開看
$# 命令列參數的個數
預定義變數
$? 最後一次執行的命令的返回狀態,為0則正確
$$ 當前進程pid
$! 後台啟動並執行最後一個進程的pid
read [選項] [變數名]
-p "提示資訊" : 輸出提示資訊等待輸入
-t 秒數 : 指定等待輸入時間
-n 字元數 : 只接受指定字元數的輸入
-s : 輸入不回顯
2. 運算子
declare [+/-][選項] 變數名 #變數型別宣告
+取消變數類型屬性
-設定類型屬性
-a 聲明為數組
-i 整型
-x 環境變數
-r 唯讀 #聲明為唯讀變數完全不能操作!!!
-p 顯示類型
聲明數組
movie[0]=zp
movie[1]=tp
declare -a moive[2]=live
查看數組
echo ${movie}
echo ${movie[2]}
echo ${movie[*]}
export 變數名 <==> declare -x 變數名
declare -p #列出系統所有變數類型
數值運算
expr let
dd=$(expr $aa + $bb)
$((運算式))
ff=$(($aa+$bb))
$[運算式]
gg=$[$aa+$bb]
變數測試
#在指令碼最佳化時使用
#具體訪問www.imooc.com/video/6832
3. 環境變數設定檔(啟動時按順序載入)
source 設定檔 #. 設定檔
/etc/profile
/etc/profile.d/*.sh
~/.bash_profile
~/.bashrc
/etc/bashrc #裡面定義了PS1,即登入提示符
umask #查看系統預設許可權----w--w-
檔案最高許可權為666 #rw-rw-rw-
目錄最高許可權為777 #rwxrwxrwx
許可權不能使用數字進行換算,而必須使用字母
umask定義的許可權,是系統預設許可權中準備丟棄的許可權~
登出時生效的環境變數設定檔
~/.bash_logout #登出配置
~/.bash_history #儲存曆史命令,當前登入曆史命令存放在記憶體
#/etc/profile HISTSIZE設定曆史命令儲存條數
登入檔案 #只對本地終端有效
/etc/issue #登入警告資訊
可以顯示的轉義符
\d 當前系統日期
\s 作業系統名字
\l 本機終端
\m 硬體體系架構
\n 主機名稱
\o 網域名稱
\r 核心版本
\t 當前系統時間
\u 當前登入使用者的序號
遠程終端歡迎資訊 #不支援轉義符
/etc/issue.net #在/etc/ssh/sshd_config加入"Banner /etc/issue.net"才能顯示(重啟sshd)
登入後顯示資訊 #本地遠程均支援
/etc/motd
4. 條件判斷
檔案類型判斷,是則真
-b 塊裝置
-c 字元裝置
-d 目錄
-e 存在為真
-f 普通檔案
-L 連結檔案
-p 管道檔案
-s 非空為真
-S 通訊端檔案
test -e /root/install.log
[ -e /root/install.log ]
[ -d /root ] && echo yes || echo no
檔案許可權判斷
-r 讀
-w 寫
-x 執行
-u SUID
-g SGID
-k SBit
兩個檔案之間進行比較
f1 -nt f2 判斷f1的修改時間是否比f2新
f1 -ot f2 判斷f1的修改時間是否比f2舊
f1 -ef f2 判斷Inode是否一致(判斷永久連結)
兩個整數
-eq -ne -gt -lt -ge -le
字串判斷
-z 字串 #為空白則真
-n 字串 #非空則真
字串1 == 字串2 #相等則真
字串1 != 字串2 #不等則真
條件陳述式
if [ 條件判斷式 ];then
程式
fi
#或者
if [ 條件判斷式1 ]
then
條件成立,程式1
elif [ 條件判斷式2 ]
then
條件不成立,程式2
else
程式
fi
case語句
case $變數名 in
"val1")
part1
;;
"val2")
part2
;;
*)
part default
;;
esac
for迴圈
for 變數 in val1 val2 val3 ...
do
程式
done
for (( i=1;i<100;i=i+1 ))
do
程式
done
while&until迴圈
while [ 條件判斷式 ]
do
程式
條件增量 #如 i=$(( $i+1 ))
done
until的條件判斷式與while相反
5. Regex
grep awk sed 包含匹配 #正則
ls find cp 完全符合 #萬用字元
* 任意前個字元
匹配日期
[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}
匹配ip
[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}
cut [選項] 檔案名稱 #欄位提取
-f 欄位
-d 分隔字元 #預設定位字元
printf '輸出類型輸出格式' 輸出內容
%ns 輸出幾個字元
%ni 幾個數字
%m.nf 幾位點幾的浮點數
awk '條件1{動作1} 條件2{動作2}...' 檔案名稱 #複雜
#df -h | grep "/dev/sda2" | awk '{print $5}' | cut -d "%" -f 1
#awk 'BEGIN{print "..."}{...}'
FS 指定分隔字元
#cat /etc/passwd | grep /bin/bash | awk 'BEGIN{FS=":"}{print $1 "\t" $3}'
#cat student.txt | grep -v Name | awk '$4>=70{print $2}'
sed [選項] '[動作]' 檔案名稱
#動作
-a 追加
-c 行替換
-i 行前插入
-p 列印
-s
-d 刪除行
字元處理
sort [選項] 檔案名稱
-f 忽略大小寫
-n 以數值型排序
-r 反向排序
-t 指定分隔字元
-k n[,m] 按指定欄位排序,n開始m結束
wc [選項] 檔案名稱
-l 行
-w 單詞
-m 字元數
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。