命令:
rename 修改文件名(適用于批量修改文件名)
與 mv 命令的區別 mv適用于 單個文件修改(單源移動時候才可以改名字)
語法:用法:
rename [選項] 表達式 替換文件...
選項:
-v, --verbose 解釋正在進行的操作
-s, --symlink 在符號鏈接上執行
-h, --help 顯示此幫助并退出
-V, --version 輸出版本信息并退出
例如:
rename de mo demo?
解讀 通配demo? 找到其中的 de 改成mo
命令:
uptime
可以查看系統啟動時間
代碼注釋:
縮進,適度添加空白行;
語言:編程語法格式,庫,算法和數據結構
變量:
局部變量
本地變量
環境變量
位置參數變量
特殊變量
數據類型:字符型、數值型
shell 默認:弱類型:字符型
算術運算:
+, -, *, /, %, **(乘方)
let VAR=expression
VAR=$[expression]
VAR=$((expression))
VAR=$(expr argu1 argu2 argu3)
注意:有些時候乘法符號需要轉義;
增強型賦值:
變量做某種算術運算后回存至此變量中;
let i=$i+# 變量不用聲明 直接使用 引用變量 使用$
let i+=#
+=,-=,*=, /=, %=
自增:
VAR=$[$VAR+1]
let VAR+=1
let VAR++
let ++VAR
自減:
VAR=$[$VAR-1]
let VAR-=1
let VAR--
let --VAR
條件測試:
判斷某需求是否滿足,需要由測試機制來實現;
如何編寫測試表達式以實現所需的測試:
(1) 執行命令,并利用命令狀態返回值來判斷;
0:成功
1-255:失敗
(2) 測試表達式
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
注意:EXPRESSION兩端必須有空白字符,否則為語法錯誤;
bash的測試類型:
數值測試
字符串測試
文件測試
數值測試:數值比較
-eq:是否等于; [ $num1 -eq $num2 ]
-ne:是否不等于;
-gt:是否大于;
-ge:是否大于等于;
-lt:是否小于;
-le:是否小于等于;
字符串測試:
==:是否等于;
>:是否大于;
<:是否小于;
!=:是否不等于;
=~:左側字符串是否能夠被右側的PATTERN所匹配;
-z "STRING":判斷指定的字串是否為空;空則為真,不空則假;
-n "STRING":判斷指定的字符串是否不空;不空則真,空則為假;
注意:
(1) 字符串要加引用;
(2) 要使用[[ ]];
文件測試:
存在性測試
-a FILE
-e FILE
文件的存在性測試,存在則為真,否則則為假;
存在性及類型測試
-b FILE:是否存在并且為 塊設備 文件;
-c FILE:是否存在并且為 字符設備 文件;
-d FILE:是否存在并且為 目錄文件;
-f FILE:是否存在并且為 普通文件;
-h FILE或 -L FILE:是否存在并且為 符號鏈接文件;
-p FILE:是否存在且為 命名管道文件;
-S FILE:是否存在且為 套接字文件;
文件權限測試:
-r FILE:是否存在并且 對當前用戶可讀;
-w FILE:是否存在并且 對當前用戶可寫;
-x FILE:是否存在并且 對當前用戶可執行;
特殊權限測試:
-u FILE:是否存在并且 擁有suid權限;
-g FILE:是否存在并且 擁有sgid權限;
-k FILE:是否存在并且 擁有sticky權限;
文件是否有內容:
-s FILE:是否有內容;
時間戳:
-N FILE:文件自從上一次讀操作后是否被修改過;
從屬關系測試:
-O FILE:當前用戶是否為文件的屬主;
-G FILE:當前用戶是否屬于文件的屬組;
雙目測試:
FILE1 -ef FILE2:FILE1與FILE2是否指向同一個文件系統的相同inode的硬鏈接;
FILE1 -nt FILE2:FILE1是否新于FILE2;
FILE1 -ot FILE2:FILE1是否舊于FILE2;
組合測試條件:
邏輯運算:
第一種方式:
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
! COMMAND
[ -O FILE ] && [ -r FILE ]
第二種方式:
EXPRESSION1 -a EXPRESSION2
EXPRESSION1 -o EXPRESSION2
! EXPRESSION
[ -O FILE -a -x FILE ]
腳本的狀態返回值:
默認是腳本中執行的最后一條件命令的狀態返回值;
自定義狀態退出狀態碼:
exit [n]:n為自己指定的狀態碼;
注意:shell進程遇到exit時,即會終止,因此,整個腳本執行即為結束;
向腳本傳遞參數:
位置參數變量
myscript.sh argu1 argu2
引用方式:
$1, $2, ..., ${10}, ${11}, ...
輪替:
shift [n]:位置參數輪替;
特殊變量:
$0:腳本文件路徑本身;
$#:腳本參數的個數;
$*:所有參數(多個字符串) "3" "4" "5"
$@:所有參數 (單個字符串)"3 4 5"
過程式編程語言的代碼執行順序:
順序執行:逐條運行;
選擇執行:
代碼有一個分支:條件滿足時才會執行;
兩個或以上的分支:只會執行其中一個滿足條件的分支;
循環執行:
代碼片斷(循環體)要執行0、1或多個來回;
選擇執行:
單分支的if語句:
if 測試條件
then
代碼分支
fi
if 測試條件; then
代碼分支
fi
雙分支的if語句:
if 測試條件; then
條件為真時執行的分支
else
條件為假時執行的分支
fi
示例:通過參數傳遞一個用戶名給腳本,此用戶不存時,則添加之;
#!/bin/bash
#
if ! grep "^$1\>" /etc/passwd &> /dev/null; then
useradd $1
echo $1 | passwd --stdin $1 &> /dev/null
echo "Add user $1 finished."
fi
#!/bin/bash
#
if [ $# -lt 1 ]; then
echo "只能添加一個用戶"
exit 2
fi
if ! grep "^$1\>" /etc/passwd &> /dev/null; then
useradd $1
echo $1 | passwd --stdin $1 &> /dev/null
echo "Add user $1 finished."
fi
#!/bin/bash
#
if [ $# -lt 1 ]; then
echo "At least one username."
exit 2
fi
if grep "^$1\>" /etc/passwd &> /dev/null; then
echo "User $1 exists."
else
useradd $1
echo $1 | passwd --stdin $1 &> /dev/null
echo "Add user $1 finished."
fi