bash程式設計之:字元測試,一般加引号
雙目:
> : 大于
< :小于
==:等于,等值比較
=~:左側是字元串,右側是一個模式,判斷左側的字元串能否被右側的模式所比對:通常隻在[[]]中使用
模式中可以使用行首、行尾錨定符,但是模式不要加引号
!=, <>: 不等于
單目:
-n 字元串: 字元串是否不空,不空為真,空則為假
-z 字元串:字元串是否為空,空則為真,不空則假:
判定所有使用者是否擁有可登入shell
#!/bin/bash
for userName in `cut -d: -f1 /etc/passwd`; do
if [[ `grep "^$userName\>" /etc/passwd | cut -d: -f7` =~ sh$ ]]; then
echo "login user: $userName"
else
echo "nologin user: $userName"
fi
done
練習:寫一個腳本
1、讓使用者互動式輸入一個使用者名,先判定使用者是否存在;不存在,則以7為退出碼;
2、判斷使用者的shell是否為/bin/bash;如果是,則顯示為“Bash User.”,退出碼為0; 否則,則顯示為“Not Bash User.”,退出碼為1;
#
read -p "Enter a user name: " userName
if ! id $userName &> /dev/null; then
echo "No such user."
exit 7
fi
userShell=`grep "^$userName\>" /etc/passwd | cut -d: -f7`
if [[ "$userShell" == "/bin/bash" ]]; then
echo "bash user."
returnValue=0
echo "Not bash user."
returnValue=1
exit $returnValue
1、顯示如下菜單:
cpu) show cpu info;
mem) show memory info;
quit) quit
Enter your option: CPU Cpu, CpU
2、如果使用者選擇cpu,則顯示檔案/proc/cpuinfo的資訊;
3、如果使用者選擇mem,則顯示檔案/proc/meminfo的資訊;
4、如果使用者選擇quit,則退出,且退出碼為5;
5、如果使用者鍵入其它字元,則顯示未知選項,請重新執行腳本;退出碼為6;
returnValue=0
cat << EOF
cpu) print cpu infomation
mem) print meory infomation
quit) Quit
EOF
read -p "Enter your option: " userOption
userOption=`echo $userOption | tr 'A-Z' 'a-z'`
if [[ "$userOption" == "cpu" ]]; then
cat /proc/cpuinfo
elif [[ "$userOption" == "mem" ]]; then
cat /proc/meminfo
elif [[ "$userOption" == "quit" ]]; then
echo "quit"
returnValue=6
echo "unkown option"
returnValue=7
vi編輯器
vim: vi improved
vi的模式:
編輯模式:鍵盤操作通常被解析為編輯指令;
輸入模式:文本輸入;
末行模式:vim的内置的指令行接口,執行vim内置指令
編輯模式-->輸入模式
i 在目前光标所在處輸入;
I 在目前光标所在行的行首輸入;
a 在目前光标所在處後面輸入;
A 在目前光标所在行的行尾輸入;
o 在光标所在行的下方新增一個空白行輸入;
O 在光标所在行的上方新增一個空白行輸入;
輸入模式-->編輯模式:
ESC
編輯模式-->末行模式:
:
末行模式-->編輯模式:
ESC, ESC
vim指令的使用格式:
vim [options] file...
+[#]: 打開檔案後直接讓光标處于第#行的行首;
vim +8 /etc/fstab 将定位到/etc/fastab第八行的行首
退出
:q! 不儲存并退出
:wq 儲存并退出
:x 儲存并退出
編輯模式:ZZ, 儲存退出
打開:vim file1 file2 ...
:next 跳轉到下一個檔案
:prev 跳轉到上一個檔案
:first 跳轉到第一個檔案
:last 跳轉到最後一個檔案
:qall 全部檔案不儲存退出
:wqall 全部檔案儲存退出
分割視窗打開多個檔案: vim -o|O file1 file2 ...
-o 水準分割 先按Ctrl+w再按上下箭頭鍵,可以在各檔案間來回切換
-O 垂直分割 先按Ctrl+w再按左右箭頭鍵,可以在各檔案間來回切換
光标移動:
行間移動:
1G 第一行
G 最後一行
行内移動:
0 絕對行首
^ 第一個非空白字元
$ 絕對行尾
單詞間移動:
w 下個單詞的詞首
e 目前或下一個詞的詞尾
b 目前或前一個詞的詞首
單字元移到:
h 左
l 右
j 下
k 上
句子間移動:
)
(
段落間移動:
}
{
編輯操作:
x 删除光标所在處的字元
#x 删除光标所在處開始向後的#個字元;
r 替換光标所在處的字元
d 删除指令,可以結合各光标跳轉指令使用
dd 删除一行
#dd 删除光标所在行其後面的行,共#行
c 删除指令,可以結合各光标跳轉指令使用
cc 删除光标所在行,并進入輸入模式
#cc 删除光标所在行開始的行,總共#行,并進入輸入模式
y 複制,可以結合各光标跳轉指令使用
yy 複制光标所在行
#yy 複制光标所在行其後面的行,共#行
p 粘貼
複制或删除的是整行
p 粘貼在光标所在行的下方
P 粘貼在光标所在行的上方
複制或删除的為非整行
p 粘貼在光标所在字元的後面
P 粘貼在光标所在字元的前面
u 撤消編輯
Ctrl+r 撤消此前的撤消
. 重複執行此前的指令
末行模式:範圍定界
10,19 第10行到第19行
10,+9 第10行開始的後9行
. 表目前行
$ 最後一行
.,$-2 目前行到倒數第三行
% 全部文本
/pat1/,/pat2/ 從光标所在行開始,第一次被pat1比對和第一次被pat2比對到之間的所有行
翻屏:
Ctrl+f 向檔案尾部翻一屏
Ctrl+b 向檔案首部翻一屏
Ctrl+d 向檔案尾部翻半屏
Ctrl+u 向檔案首部翻半屏
Enter 向檔案首部上移一行 k 向檔案尾部下移一行
查找:
/keyword
?keyword
n:
N:
支援正規表達式
:set nohlsearch 關閉高亮顯示,對目前shell有效
vim可視化模式:
v 按光标走過的區域選擇
V 選擇矩形塊,按光标走過的行選擇
分割目前視窗:
Ctrl+w, s 水準分割目前視窗
Ctrl+w, v 垂直分割目前序列槽
視窗屬性的定義:
:set nu 顯示行号
:set nonu 取消顯示行号
:set ai 設定自動縮進
:set noai 取消自動縮進
:set ic 忽略大小寫
:set noic 區分大小寫
:set sm 顯示對應的括号
:set nosm 不顯示對應的括号
:syntax on 開啟文法高亮
:syntax off 關閉文法高亮
:set hlsearch 開啟搜尋高亮
:set nohlsearch 關閉搜尋高亮
vim的配置檔案:
全局:/etc/vimrc
個人:~/.vimrc
查找替換:
:位址定界s/查找模式/替換為的内容/gi
g: global 全局替換
i: ignore-case 忽略大小寫
:位址定界s@查找模式@替換為的内容@gi
&: 用于在替換為的内容部分中引用前面比對到的所有内容;
練習:
1、複制/etc/grub.conf至/tmp目錄,删除/tmp/grub.conf檔案中行首的空白符;
%s@^[[:space:]]\{1,\}@@g
2、複制/etc/rc.d/rc.sysinit至/tmp目錄,将/tmp/rc.sysinit檔案中的以至少一個空白字元開頭的行,行首加#号
:%s@^[[:space:]]\{1,\}.*@#&@
3、删除/tmp/rc.sysinit檔案中以#開頭且後面跟了至少一個空白字元的行的行首的#号和空白符;
:%s@^#[[:space:]]\{1,\}@@g
4、為/tmp/grub.conf檔案中前三行的行首加#号;
1,3s@^@#@g
5、将/etc/yum.repos.d/CentOS-Media.repo中enable=0一行最後的0改為1;
%s@\(enabled=\)[0-9]@\11@g
bash知識點:檔案測試
單目測試:
-e file 測試檔案是否存在
-s file 測試檔案是否存在并且不空
-f file 測試是否為普通檔案
-d file 測試是否為目錄檔案
-b file 測試是否為塊裝置檔案
-c file 測試是否為字元裝置檔案
-h|-L file 測試是否為符号連結檔案
-p file 測試是否為管道檔案
-S file 測試是否為套接字檔案
-r file 測試其有效使用者是否對此檔案有讀權限
-w file 測試其有效使用者是否對此檔案有寫權限
-x file 測試其有效使用者是否對此檔案有執行權限
雙目測試:
file1 -nt file2 測試file1是否為file2更 新一些
寫一個腳本,完成如下任務:
1、分别複制/var/log下的檔案至/tmp/logs/目錄中;
2、複制目錄時,才使用cp -r
3、複制檔案時,使用cp
4、複制連結檔案,使用cp -d
5、餘下的類型,使用cp -a
targetDir='/tmp/logs'
[ -e $targetDir ] || mkdir $targetDir
for fileName in /var/log/*; do
if [ -d $fileName ]; then
copyCommand='cp -r'
elif [ -f $fileName ]; then
copyCommand='cp'
elif [ -h $fileName ]; then
copyCommand='cp -d'
else
copyCommand='cp -a'
fi
$copyCommand $fileName $targetDir
寫一個腳本,完成如下任務,其使用形式如下所示:
script.sh {start|stop|restart|status}
其中:
如果參數為空,則顯示幫助資訊,并退出腳本;
如果參數為start,則建立空檔案/var/lock/subsys/script,并顯示“starting script successfully.”
如果參數為stop,則删除檔案/var/lock/subsys/script,并顯示“Stop script successfully.”
如果參數為restart,則删除檔案/var/locksubsys/script并重新建立,而後顯示“Restarting script successfully.”
如果參數為status,那麼:
如果檔案/var/lock/subsys/script存在,則顯示“Script is running...”,否則,則顯示“Script is stopped.”
bash的知識點:位置參數輪替(shift)
declare -i sum=0
for i in `seq 1 $#`; do
let sum+=$1
shift
echo $sum
寫一個腳本:使用形式如下
userinfo.sh -u username [-v {1|2}]
-u選項用于指定使用者;而後腳本顯示使用者的UID和GID;
如果同時使用了-v選項:
-v後面的值如果是1, 則額外顯示使用者的家目錄路徑;
-v後面的值如果是2, 則額外顯示使用者的家目錄路徑和shell;
[ $# -lt 2 ] && echo "Too less argements, quit" && exit 3
if [[ "$1" == "-u" ]];then
userName="$2"
shift 2
if [ $# -ge 2 ] && [ "$1" == "-v" ]; then
verFlag=$2
verFlag=${verFlag:-0}
if [ -n $verFlag ];then
if ! [[ $verFlag =~ [012] ]];then
echo "Wrong parameter."
echo "Usage: `basename $0` -u UserName -v {1|2}"
exit 4
# echo $userName $verFlag
if [ $verFlag -eq 1 ]; then
grep "^$userName" /etc/passwd | cut -d: -f1,3,4,6
elif [ $verFlag -eq 2 ];then
grep "^$userName" /etc/passwd | cut -d: -f1,3,4,6,7
grep "^$userName" /etc/passwd | cut -d: -f1,3,4
本文轉自開源殿堂 51CTO部落格,原文連結:http://blog.51cto.com/kaiyuandiantang/1939647,如需轉載請自行聯系原作者