講師_@王曉春
摘要:
- 編程基礎(chǔ)
- 腳本基本格式
- 變量
- 運(yùn)算
- 條件測試
- 條件判斷if
- 條件判斷case
- 配置用戶環(huán)境
▼編程基礎(chǔ)
- shell編程:過程式,、解釋執(zhí)行
編程語言的基本結(jié)構(gòu): 各種系統(tǒng)命令的組合 數(shù)據(jù)存儲(chǔ):變量、數(shù)組 表達(dá)式:a + b 語句:if
▼shell腳本基礎(chǔ)
- shell腳本通常以shebang起始
#!/bin/bash
只有第一行可以使用shebang
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
- 自動(dòng)化常用命令
- 執(zhí)行系統(tǒng)管理和故障排除
- 創(chuàng)建簡單的應(yīng)用程序
- 處理文本或文件
?創(chuàng)建shell腳本
1. 使用文本編輯器來創(chuàng)建文本文件
- 第一行必須包括shell聲明序列:#!
示例:#!/bin/bash - 添加注釋:注釋以#開頭
2. 運(yùn)行腳本
- 給予執(zhí)行權(quán)限,,在命令行上指定腳本的絕對或相對路徑
- 直接運(yùn)行解釋器,,將腳本作為解釋器程序的參數(shù)運(yùn)行
腳本規(guī)范
- 第一行一般為調(diào)用使用的語言
- 程序名,避免更改文件名為無法找到正確的文件
- 版本號
- 更改后的時(shí)間
- 作者相關(guān)信息
- 該程序的作用,,及注意事項(xiàng)
- 最后是各版本的更新簡要說明
?腳本的基本結(jié)構(gòu)
#!SHEBANG
CONFIGURATION_VARIABLES
FUNCTION_DEFINITIONS
MAIN_CODE
shell腳本示例
#!/bin/bash
# ------------------------------------------
# Filename: hello.sh
# Revision: 1.1
# Date: 2017/06/01
# Author: wang
# Email: [email protected]
# Website: www.
# Description: This is the first script
# Copyright: 2017 wang
# License: GPL
# ------------------------------------------
echo “hello world”
檢測腳本中的語法錯(cuò)誤 bash -n /path/to/some_script 調(diào)試執(zhí)行 bash -x /path/to/some_script
?變量
- 靜態(tài)編譯語言:使用變量前,,先聲明變量類型,之后類型不能改變,,在編譯時(shí)檢查,,如:java,c
- 動(dòng)態(tài)編譯語言:不用事先聲明,,可隨時(shí)改變類型,,如bash,Python
- 強(qiáng)類型語言:不同類型數(shù)據(jù)操作,,必須經(jīng)過強(qiáng)制轉(zhuǎn)換才同一類型才能運(yùn)算,,如java , c# ,,python
- 弱類型語言:語言的運(yùn)行時(shí)會(huì)隱式做數(shù)據(jù)類型轉(zhuǎn)換,。無須指定類型,默認(rèn)均為字符型,;參與運(yùn)算會(huì)自動(dòng)進(jìn)行隱式類型轉(zhuǎn)換,;變量無須事先定義可直接調(diào)用
1. Shell中變量命名法則:
1、不能使程序中的保留字:例如if, for 2、只能使用數(shù)字,、字母及下劃線,,且不能以數(shù)字開頭 3、見名知義 4,、統(tǒng)一命名規(guī)則:駝峰命名法
- Shell中命名建議規(guī)則:
1、變量名大寫 2,、局部變量小寫 3,、函數(shù)名小寫 4、用英文名字,,并體現(xiàn)出實(shí)際作用
2. bash中變量的種類
根據(jù)變量的生效范圍等標(biāo)準(zhǔn)劃分下面變量類型
- 局部變量:生效范圍為當(dāng)前shell進(jìn)程,;對當(dāng)前shell之外的其它shell進(jìn)程,包括當(dāng)前shell的子shell進(jìn)程均無效
- 環(huán)境變量:生效范圍為當(dāng)前shell進(jìn)程及其子進(jìn)程
- 本地變量:生效范圍為當(dāng)前shell進(jìn)程中某代碼片斷,,通常指函數(shù)
- 位置變量:$1, $2, …來表示,,用于讓腳本在腳本代碼中調(diào)用通過命令行傳遞給它的參數(shù)
- 特殊變量:
$?, $0, $*, $@, $#,$$
$BASHPID:當(dāng)前進(jìn)程的PID $PPID:父進(jìn)程的PID
只讀變量:declare -r VAR 或 readonly VAR
局部變量
- 變量引用:${name} 或者 $name
' ' 弱引用,其中的變量引用會(huì)被替換為變量值 ' ' 強(qiáng)引用,,其中的變量引用不會(huì)被替換為變量值,,而保持原字符串 - 顯示已定義的所有變量:set
- 刪除變量:unset name
bash內(nèi)建的環(huán)境變量 | | |
---|
$PATH | $_ 上一條命令的最后一條參數(shù) | $HISTSIZE | $SHELL | $HOSTNAME | $MAIL | $USER | $LANG | $SHLVL bash嵌套深度 | $UID | $PWD | $HOME |
位置變量
退出狀態(tài)
-
進(jìn)程使用退出狀態(tài)來報(bào)告成功或失敗 0 代表成功,1-255 代表失敗 $? 變量保存最近的命令退出狀態(tài) -
退出狀態(tài)碼 -
bash自定義退出狀態(tài)碼 -
exit [n] :自定義退出狀態(tài)碼 注意:腳本中一旦遇到exit命令,,腳本會(huì)立即終止,;終止退出狀態(tài)取決于exit命令后面的數(shù)字 注意:如果未給腳本指定退出狀態(tài)碼,整個(gè)腳本的退出狀態(tài)碼取決于腳本中執(zhí)行的最后一條命令的狀態(tài)碼
3. 算術(shù)運(yùn)算
賦值
邏輯運(yùn)算
短路運(yùn)算
條件測試
- 真與假或
- 命令為真時(shí):直接找
&& 后的命令 - 命令為假時(shí):直接找
|| 后的命令 - 例如:
grep -q no_such_user /etc/passwd || echo 'No such user'
No such user
ping -c1 -W2 station1 &> /dev/null > && echo 'station1 is up' > || (echo 'station1 is unreachable'; exit 1)
station1 is up
4. test命令
test '$A' = '$B' && echo 'Strings are equal'
test “$A” -eq “$B” && echo 'Integers are equal'
[ '$A' = '$B' ] && echo 'Strings are equal'
[ '$A' -eq '$B' ] && echo 'Integers are equal'
bash的數(shù)值測試
-v VAR 變量VAR是否設(shè)置 例:[ -v x ] && echo 1 || echo 0
數(shù)值測試 | | 字符串測試 | |
---|
-gt | 是否大于 | = | 是否等于 | -ge | 是否大于等于 | > | ascii碼是否大于ascii碼 | -eq | 是否等于 | < | 是否小于 | -ne | 是否不等于 | != | 是否不等于 | -lt | 是否小于 | =~ | 左側(cè)字符串是否能夠被右側(cè)的PATTERN所匹配 | -le | 是否小于等于 | | ↑ 注意: 此表達(dá)式一般用于[[ ]] 中;擴(kuò)展的正則表達(dá)式 | | | -z 'STRING“ | 字符串是否為空,,空為真,,不空為假 | | | -n 'STRING“ | 字符串是否不空,不空為真,,空為假 |
注意:用于字符串比較時(shí)的用到的操作數(shù)都應(yīng)該使用引號
bash的文件測試
存在性 | | 文件權(quán)限 | | 文件大小測試 | |
---|
-a FILE | 同-e | -r FILE | 是否可讀 | -t fd | fd 文件描述符是否在某終端已經(jīng)打開 | -e FILE | 文件是否存在 | -w FILE | 是否可寫 | -N FILE | 文件自從上一次被讀取之后是否被修改過 | | | -x FILE | 是否可執(zhí)行 | -O FILE | 當(dāng)前有效用戶是否為文件屬主 | 類別 | | 文件特殊權(quán)限 | | -G FILE | 當(dāng)前有效用戶是否為文件屬組 | -d FILE | 是否目錄 | -u FILE | 是否有SUID權(quán)限 | FILE1 -ef FILE2 | FILE1是否是FILE2的硬鏈接 | -f FILE | 是否普通文件 | -g FILE | 是否有SGID權(quán)限 | FILE1 -nt FILE2 | FILE1是否新于FILE2(mtime) | -h FILE 或 -L FILE | 是否符號鏈接文件 | -k FILE | 是否有STICKY權(quán)限 | FILE1 -ot FILE2 | FILE1是否舊于FILE2 | -b FILE | 是否塊設(shè)備文件 | | | | | -c FILE | 是否字符文件 | -s FILE | 是否存在且非空 | | | -p FILE | 是否管道文件 | | | | | -S FILE | 是否套接字文件 | | | | |
組合測試條件
- 第一種方式:
COMMAND1 && COMMAND2 并且 COMMAND1 || COMMAND2 或者 ! COMMAND 非
如: [ -f “KaTeX parse error: Expected 'EOF', got '&' at position 9: FILE” ] &?& [[ “FILE”=~ .*.sh$ ]]
- 第二種方式:
EXPRESSION1 -a EXPRESSION2 并且 EXPRESSION1 -o EXPRESSION2 或者 ! EXPRESSION 必須使用測試命令進(jìn)行,,[[ ]] 不支持
示例: [ -z “$HOSTNAME” -o $HOSTNAME '==“l(fā)ocalhost.localdomain” ] && hostname www. [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab
5. 使用read命令來接受輸入
- 使用read來把輸入值分配給一個(gè)或多個(gè)shell變量
-p 指定要顯示的提示 -s 靜默輸入,一般用于密碼 -n N 指定輸入的字符長度N -d '字符’ 輸入結(jié)束符 -t N TIMEOUT為N秒
- read 從標(biāo)準(zhǔn)輸入中讀取值,,給每個(gè)單詞分配一個(gè)變量
- 所有剩余單詞都被分配給最后一個(gè)變量
read -p “Enter a filename: “ FILE
6. 條件選擇 if 語句
#單分支
if 判斷條件
then
條件為真的分支代碼
else
條件為假的分支代碼
fi
#多分支
if 判斷條件1
then
條件1為真的分支代碼
elif 判斷條件2
then
條件2為真的分支代碼
elif 判斷條件3
then
條件3為真的分支代碼
else
以上條件都為假的分支代碼
fi
- 逐條件進(jìn)行判斷,,第一次遇為“真”條件時(shí),,執(zhí)行其分支,而后結(jié)束整個(gè)if語句
If示例
根據(jù)命令的退出狀態(tài)來執(zhí)行命令
if ping -c1 -W2 station1 &> /dev/null; then
echo 'Station1 is UP' elif grep 'station1' ~/maintenance.txt &> /dev/null; then
echo 'Station1 is undergoing maintenance'
else
echo 'Station1 is unexpectedly DOWN!'
exit 1
fi
7. 條件判斷:case語句
case 變量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默認(rèn)分支
;;
esac
- case支持glob風(fēng)格的通配符:
* : 任意長度任意字符 ? : 任意單個(gè)字符 [ ] :指定范圍內(nèi)的任意單個(gè)字符 a|b : a或b
8. bash如何展開命令行
- 把命令行分成單個(gè)命令詞
- 展開別名
- 展開大括號的聲明({})
- 展開波浪符聲明(~)
- 命令替換$() 和 ``)
- 再次把命令行分成命令詞
- 展開文件通配(*、?,、[abc]等等)
- 準(zhǔn)備I/0重導(dǎo)向(<、>)
- 運(yùn)行命令
- 防止擴(kuò)展
反斜線(\)會(huì)使隨后的字符按原意解釋
$ echo Your cost: \$5.00
Your cost: $5.00
- 加引號來防止擴(kuò)展
·單引號(’ )防止所有擴(kuò)展 ·雙引號(” )也防止所有擴(kuò)展,,但是以下情況例外: $(美元符號) - 變量擴(kuò)展 ` (反引號) - 命令替換 \(反斜線) - 禁止單個(gè)字符擴(kuò)展 !(嘆號) - 歷史命令替換
▼bash的配置文件
按生效范圍劃分,,存在兩類:
- 全局配置:
/etc/profile /etc/profile.d/*.sh /etc/bashrc - 個(gè)人配置:
~/.bash_profile ~/.bashrc - shell登錄兩種方式
交互式登錄: (1)直接通過終端輸入賬號密碼登錄 (2)使用“su - UserName” 切換的用戶 執(zhí)行順序:/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登錄: (1)su UserName (2)圖形界面下打開的終端 (3)執(zhí)行腳本 (4)任何其它的bash實(shí)例 執(zhí)行順序: /etc/profile.d/*.sh --> /etc/bashrc -->~/.bashrc
- 按功能劃分,存在兩類:
profile 類和bashrc 類
-
profile類:為交互式登錄的shell提供配置 全局:/etc/profile, /etc/profile.d/*.sh 個(gè)人:~/.bash_profile 功用: (1) 用于定義環(huán)境變量 (2) 運(yùn)行命令或腳本 -
Bashrc類 bashrc類:為非交互式和交互式登錄的shell提供配置 全局:/etc/bashrc 個(gè)人:~/.bashrc 功用: (1) 定義命令別名和函數(shù) (2) 定義本地變量
?編輯配置文件生效
- 修改profile和bashrc文件后需生效
兩種方法: 1重新啟動(dòng)shell進(jìn)程 2 . 或source
例: . ~/.bashrc
1. Bash 退出任務(wù)
- 保存在~/.bash_logout文件中(用戶)
- 在退出登錄shell時(shí)運(yùn)行
- 用于
·創(chuàng)建自動(dòng)備份 ·清除臨時(shí)文件
2. $- 變量
h:hashall,打開這個(gè)選項(xiàng)后,,Shell 會(huì)將命令所在的路徑hash下來,,避免每次都要查詢。通過set +h將h選項(xiàng)關(guān)閉 i:interactive-comments,,包含這個(gè)選項(xiàng)說明當(dāng)前的 shell 是一個(gè)交互式的 shell,。所謂的交互式shell,在腳本中,i選項(xiàng)是關(guān)閉的,。 m:monitor,,打開監(jiān)控模式,就可以通過Job control來控制進(jìn)程的停止,、繼續(xù),,后臺(tái)或者前臺(tái)執(zhí)行等。 B:braceexpand,,大括號擴(kuò)展 H:history,,H選項(xiàng)打開,可以展開歷史列表中的命令,,可以通過!感嘆號來完成,,例如“!!”返回上最近的一個(gè)歷史命令,“!n”返回第 n 個(gè)歷史命令
set 命令
- $- 變量
h :hashall,,打開這個(gè)選項(xiàng)后,,Shell 會(huì)將命令所在的路徑hash下來,避免每次都要查詢,。通過set +h將h選項(xiàng)關(guān)閉 i :interactive-comments,,包含這個(gè)選項(xiàng)說明當(dāng)前的 shell 是一個(gè)交互式的 shell。所謂的交互式shell,在腳本中,,i選項(xiàng)是關(guān)閉的,。 m :monitor,打開監(jiān)控模式,,就可以通過Job control來控制進(jìn)程的停止,、繼續(xù),后臺(tái)或者前臺(tái)執(zhí)行等,。 B :braceexpand,,大括號擴(kuò)展 H :history,H選項(xiàng)打開,,可以展開歷史列表中的命令,,可以通過!感嘆號來完成,例如“!!”返回上最近的一個(gè)歷史命令,,“!n”返回第 n 個(gè)歷史命令
重要
set -u 在擴(kuò)展一個(gè)沒有設(shè)置的變量時(shí),,顯示錯(cuò)誤信息(等同set –o nounset)set -e 如果一個(gè)命令返回一個(gè)非0退出狀態(tài)值(失敗)就退出(等同set –o errexit)
練習(xí)
1,、編寫腳本per.sh,判斷當(dāng)前用戶對指定參數(shù)文件,是否不可讀并且不可寫 2,、編寫腳本excute.sh ,,判斷參數(shù)文件是否為sh后綴的普通文件,如果是,,添加所有人可執(zhí)行權(quán)限,,否則提示用戶非腳本文件 3、編寫腳本nologin.sh和login.sh,,實(shí)現(xiàn)禁止和允許普通用戶登錄系統(tǒng) 4,、編寫腳本/root/bin/argsnum.sh,接受一個(gè)文件路徑作為參數(shù),;如果參數(shù)個(gè)數(shù)小于1,,則提示用戶“至少應(yīng)該給一個(gè)參數(shù)”,,并立即退出,;如果參數(shù)個(gè)數(shù)不小于1,則顯示第一個(gè)參數(shù)所指向的文件中的空白行數(shù) 5,、編寫腳本/root/bin/hostping.sh,,接受一個(gè)主機(jī)的IPv4地址做為參數(shù),測試是否可連通,。如果能ping通,,則提示用戶“該IP地址可訪問”;如果不可ping通,,則提示用戶“該IP地址不可訪問” 6,、編寫腳本/root/bin/checkdisk.sh,檢查磁盤分區(qū)空間和inode使用率,,如果超過80%,,就發(fā)廣播警告空間將滿 Bash的文件測試 7、編寫腳本/root/bin/sumid.sh,,計(jì)算/etc/passwd文件中的第10個(gè)用戶和第20用戶的ID之和 8,、編寫腳本/root/bin/sumspace.sh,傳遞兩個(gè)文件路徑作為參數(shù)給腳本,,計(jì)算這兩個(gè)文件中所有空白行之和 9,、編寫腳本/root/bin/sumfile.sh,統(tǒng)計(jì)/etc, /var, /usr目錄中共有多少個(gè)一級子目錄和文件 10、編寫腳本/root/bin/createuser.sh,,實(shí)現(xiàn)如下功能:使用一個(gè)用戶名做為參數(shù),,如果指定參數(shù)的用戶存在,就顯示其存在,,否則添加之,;顯示添加的用戶的id號等信息 11,、編寫腳本/root/bin/yesorno.sh,提示用戶輸入yes或no,并判斷用戶輸入的是yes還是no,或是其它信息 12,、編寫腳本/root/bin/filetype.sh,判斷用戶輸入文件路徑,,顯示其文件類型(普通,目錄,,鏈接,,其它文件類型) 13、編寫腳本/root/bin/checkint.sh,判斷用戶輸入的參數(shù)是否為正整數(shù) 14,、編寫腳本/root/bin/systeminfo.sh,顯示當(dāng)前主機(jī)系統(tǒng)信息,,包括主機(jī)名,IPv4地址,,操作系統(tǒng)版本,,內(nèi)核版本,CPU型號,,內(nèi)存大小,,硬盤大小 15、編寫腳本/root/bin/backup.sh,,可實(shí)現(xiàn)每日將/etc/目錄備份到/root/etcYYYY-mm-dd中 16,、編寫腳本/root/bin/disk.sh,顯示當(dāng)前硬盤分區(qū)中空間利用率最大的值 17、編寫腳本/root/bin/links.sh,顯示正連接本主機(jī)的每個(gè)遠(yuǎn)程主機(jī)的IPv4地址和連接數(shù),,并按連接數(shù)從大到小排序 18,、讓所有用戶的PATH環(huán)境變量的值多出一個(gè)路徑,例如:/usr/local/apache/bin 19,、用戶root登錄時(shí),,將命令指示符變成紅色,并自動(dòng)啟用如下別名: rm='rm –i’ cdnet='cd /etc/sysconfig/network-scripts/’ editnet='vim /etc/sysconfig/network-scripts/ifcfg-eth0’ editnet='vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 或 ifcfg-ens33 ’ (如果系統(tǒng)是CentOS7) 20,、任意用戶登錄系統(tǒng)時(shí),,顯示紅色字體的警示提醒信息“Hi,dangerous!” 21,、編寫生成腳本基本格式的腳本,,包括作者,聯(lián)系方式,,版本,,時(shí)間,描述等 22,、編寫用戶的環(huán)境初始化腳本reset.sh,,包括別名,登錄提示符,,vim的設(shè)置,,環(huán)境變量等
練習(xí)答案
1,、編寫腳本per.sh,判斷當(dāng)前用戶對指定參數(shù)文件,是否不可讀并且不可寫
#!/bin/bash
if [ -e $1 ]
then
[ ! -r $1 -a ! -w $1 ] && echo 'The file is not write and not red' || echo 'The file can read or write'
else
echo 'The file isn't exist'
fi
2,、編寫腳本excute.sh ,,判斷參數(shù)文件是否為sh后綴的普通文件,如果是,,添加所有人可執(zhí)行權(quán)限,,否則提示用戶非腳本文件
#!/bin/bash
[ -f $1 -a $(echo $1 | grep '.*\.sh') ] && chmod 755 $1;echo 'yesyes' || echo ' isn't a script'
3、編寫腳本nologin.sh和login.sh,,實(shí)現(xiàn)禁止和允許普通用戶登錄系統(tǒng)
#!/bin/bash
loginyes=none
nologin=none
[ -f /etc/nologin ] && read -n 1 -p 'Do you want to allow user login[Y/N]:' nologin || read -n 1 -p 'Do you want to forbid user login[Y/N]: ' loginyes
loginyes=$(echo $loginyes | tr 'A-Z' 'a-z')
nologin=$(echo $nologin | tr 'A-Z' 'a-z')
#echo -e 'your choose is $loginyes \n please wait! \n ... \n Done,all of users was forbid to login.'
#echo 'your choose is $nologin \n please wait! \n ... \n Done,all of users was allowed to login.'
if [ $loginyes = 'y' ]
then
echo -e '\nyou choose yeyesyess'
touch /etc/nologin
elif [ $loginyes = 'n' ]
then
echo -e '\nyou choose NO'
fi
if [ $nologin = 'y' ]
then
echo -e '\n you choose yes'
rm -f /etc/nologin
elif [ $nologin = 'n' ]
then
echo -e '\nyou choose No'
fi
4,、編寫腳本/root/bin/argsnum.sh,接受一個(gè)文件路徑作為參數(shù),;如果參數(shù)個(gè)數(shù)小于1,,則提示用戶“至少應(yīng)該給一個(gè)參數(shù)”,并立即退出,;如果參數(shù)個(gè)數(shù)不小于1,,則顯示第一個(gè)參數(shù)所指向的文件中的空白行數(shù)
#!/bin/bash
[ $# -lt 1 ] && echo 'you must give me unless one agrument'&&exit 1 || echo `cat $1| grep ^$|wc -l`
5、編寫腳本/root/bin/hostping.sh,,接受一個(gè)主機(jī)的IPv4地址做為參數(shù),,測試是否可連通,。如果能ping通,,則提示用戶“該IP地址可訪問”;如果不可ping通,,則提示用戶“該IP地址不可訪問”
#!/bin/bash
#ping ip
ping -c 1 $1 > /dev/nul
[ $? -eq 0 ] && echo 'ip can ping' || echo ' ip can't ping'
6,、編寫腳本/root/bin/checkdisk.sh,檢查磁盤分區(qū)空間和inode使用率,,如果超過80%,,就發(fā)廣播警告空間將滿 Bash的文件測試
#!/bin/bash
#test6 disk user%
USES=$(df | egrep -o '[0-9]{1,3}%' | tr -d %| sort -nr|head -1)
USEI=$(df -i | egrep -o '[0-9]{1,3}%' | tr -d %| sort -nr|head -1)
[ $USES -ge 80 ] && wall 'WARNING! the disk for almost'
[ $USEI -ge 80 ] && wall 'WARNING! the inode for almost'
7、編寫腳本/root/bin/sumid.sh,,計(jì)算/etc/passwd文件中的第10個(gè)用戶和第20用戶的ID之和
#!/bin/bash
USER10=$(cat /etc/passwd | head -10 | tail -1|cut -d: -f3)
USER20=$(cat /etc/passwd | head -20 | tail -1|cut -d: -f3)
SUMUSER=$[ $USER10 + $USER20 ]
echo 'ID sum is $SUMUSER'
8,、編寫腳本/root/bin/sumspace.sh,傳遞兩個(gè)文件路徑作為參數(shù)給腳本,,計(jì)算這兩個(gè)文件中所有空白行之和
#!/bin/bash
[ $# -lt 1 ] && echo 'please input unless one argument' && exit
#SUM1=$(cat $1 | grep ^$|wc -l)
#SUM2=$(cat $2 | grep ^$|wc -l)
#SUM=$[ $SUM1 + $SUM2 ]
sum=$( cat $@ | grep '^$' | wc -l )
echo 'the space sum is $sum'
9,、編寫腳本/root/bin/sumfile.sh,統(tǒng)計(jì)/etc, /var, /usr目錄中共有多少個(gè)一級子目錄和文件
#!/bin/bash
ETC=$( ls -dl /etc/* /var/* /usr/*| wc -l)
echo '/etc and /var and /usr have $ETC directories or file'
10、編寫腳本/root/bin/createuser.sh,,實(shí)現(xiàn)如下功能:使用一個(gè)用戶名做為參數(shù),,如果指定參數(shù)的用戶存在,就顯示其存在,,否則添加之,;顯示添加的用戶的id號等信息
#!/bin/bash
#10.createuser
[ $# -lt 1 ] && echo 'plead input unless one argument' && exit 1
useradd $1 &> /dev/nul
USER_EXIT=$?
[ $USER_EXIT -eq 9 ] && echo 'createuser.sh: user $1 already exists' && exit 9
[ ! $USER_EXIT -eq 0 ] && echo 'createuser.sh: ERROR'
id $1
11,、編寫腳本/root/bin/yesorno.sh,提示用戶輸入yes或no,并判斷用戶輸入的是yes還是no,或是其它信息
#!/bin/bash
read -p 'Please input [Yes/No]:' YESORNO
case $YESORNO in
[Yy][Ee][Ss]|[Yy])
echo 'you choose yesyes'
;;
[Nn][Oo]|[Nn])
echo 'you choose no'
;;
*)
echo 'you choose other'
esac
12,、編寫腳本/root/bin/filetype.sh,判斷用戶輸入文件路徑,,顯示其文件類型(普通,目錄,,鏈接,,其它文件類型)
#!/bin/bash
[ $# -lt 1 ] && echo 'Please input unless one argument!' && exit
for count in `seq 1 $#`
do
CHAR=$(eval ls -dl \$$count | cut -c 1)
CO='\e[1;32m'
LOR='\e[0m'
case $CHAR in
-)
echo -e 'The file type is \e[1;32mnormal file\e[0m'
;;
l)
echo -e 'The file type is $CO link file $LOR'
;;
d)
echo -e 'The file type is $CO directory $LOR'
;;
*)
echo 'sorry,I still don't know the file type '
esac
done
13、編寫腳本/root/bin/checkint.sh,判斷用戶輸入的參數(shù)是否為正整數(shù)
#!/bin/bash
[ $# -lt 1 ] && echo 'Please intput unless one argument' && exit
[ $# -gt 1 ] && echo 'I just can understand one argument' && exit
[[ $1 =~ ^[0-9]*$ ]] && echo 'your argument is a positive integer' || echo 'your argument isn't a INT'
14,、編寫腳本/root/bin/systeminfo.sh,顯示當(dāng)前主機(jī)系統(tǒng)信息,,包括主機(jī)名,IPv4地址,,操作系統(tǒng)版本,,內(nèi)核版本,CPU型號,,內(nèi)存大小,,硬盤大小
#!/bin/bash
CO='\e[1;31m'
LOR='\e[0m'
echo -e 'The hostname is $CO `hostname` $LOR'
echo -e 'The IP address is $CO `ifconfig ens33| egrep -o '(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]){3}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\>'` $LOR'
echo -e 'The kernel release $CO `uname -r` $LOR'
echo -e 'The System version is $CO `cat /proc/version | grep -o '.*64'` $LOR'
echo -e 'The CPU model is $CO `lscpu | grep 'Model name'|cut -d: -f2 |tr -d ' ' ` $LOR'
echo -e 'The memory is $CO `lsmem | grep 'Total online memory'|cut -d: -f2|tr -d ' '` $LOR'
echo -e 'The disk is $CO `lsblk | grep '\<sda\>'|tr -s ' '| cut -d ' ' -f4` $LOR'
15、編寫腳本/root/bin/backup.sh,,可實(shí)現(xiàn)每日將/etc/目錄備份到/root/etcYYYY-mm-dd中
#!/bin/bash
cp -a /etc/ /root/etc`date %F`
16,、編寫腳本/root/bin/disk.sh,顯示當(dāng)前硬盤分區(qū)中空間利用率最大的值
#!/bin/bash
echo -e 'The disk use ratio is `df | grep -o '...%'|tr -d %|sort -nr|head -1`%'
17、編寫腳本/root/bin/links.sh,顯示正連接本主機(jī)的每個(gè)遠(yuǎn)程主機(jī)的IPv4地址和連接數(shù),,并按連接數(shù)從大到小排序
#!/bin/bash
#links.sh
echo 'you host links stat is :'
who | egrep -o '(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]){3}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\>'|uniq -c|sort -nr
18,、讓所有用戶的PATH環(huán)境變量的值多出一個(gè)路徑,例如:/usr/local/apache/bin
vim /etc/profile.d/env.sh
export PATH=/usr/local/apache/bin:$PATH
source /etc/profile.d/env.sh
19,、用戶root登錄時(shí),,將命令指示符變成紅色,并自動(dòng)啟用如下別名:
vim /root/.bashrc
...
PS1='\[\e[1;31m\][\u@\h \w]\$\[\e[0m\]'
rm='rm –i’
cdnet='cd /etc/sysconfig/network-scripts/’
editnet='vim /etc/sysconfig/network-scripts/ifcfg-ens33’
...
20,、任意用戶登錄系統(tǒng)時(shí),,顯示紅色字體的警示提醒信息“Hi,dangerous!”
#任意用戶登錄系統(tǒng)時(shí),會(huì)按如下讀取配置,,在如下哪個(gè)文件寫都可以
#/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
vim /etc/profile.d/env.sh
echo -e '\033[31m hi,dangerous! \033[0m'
21,、編寫生成腳本基本格式的腳本,包括作者,,聯(lián)系方式,,版本,時(shí)間,,描述等 示例
vim ~/.vimrc
set nu 'show line
set ts=4 'TAB 4 chars
syntax on 'grammar light
set cursorline
'set mouse=a
set ai
autocmd BufNewFile *.sh exec ':call SetTitle()'
func SetTitle()
if expand('%:e') == 'sh'
call setline(1,'#!/bin/bash')
call setline(2,'#')
call setline(3,'#***********************************************************')
call setline(4,'#Author: Jibill Chen')
call setline(5,'#QQ: *********')
call setline(6,'#Date: '.strftime('%Y-%m-%d'))
call setline(7,'#FileName: '.expand('%'))
call setline(8,'#URL: http://thson.blog.csdn.net')
call setline(9,'#Description: The test script')
call setline(10,'#**********************************************************')
call setline(11,'')
endif
endfunc
autocmd BufNewFile * normal G
22,、編寫用戶的環(huán)境初始化腳本reset.sh,包括別名,,登錄提示符,,vim的設(shè)置,,環(huán)境變量等
vim reset.sh
...
cat >> ~/.bash_profile << EOF
PS1='\[\e[1;8;$[RANDOM%6+41]m\][\u@\h \w]\$\[\e[0m\]'
export REGEX_IP='(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])'
EOF
#config bashrc
cat >> ~/.bashrc << EOF
alias cdnet='cd /etc/sysconfig/network-scripts/'
EOF
#config vimrc
cat >> ~/.vimrc << EOF
set nu 'show line
set ts=4 'TAB 4 chars
syntax on 'grammar light
set cursorline
'set mouse=a
set ai
autocmd BufNewFile *.sh exec ':call SetTitle()'
func SetTitle()
if expand('%:e') == 'sh'
call setline(1,'#!/bin/bash')
call setline(2,'#')
call setline(3,'#***********************************************************')
call setline(4,'#Author: Jibill Chen')
call setline(5,'#QQ: **********')
call setline(6,'#Date: '.strftime('%Y-%m-%d'))
call setline(7,'#FileName: '.expand('%'))
call setline(8,'#URL: http://thson.blog.csdn.net')
call setline(9,'#Description: The test script')
call setline(10,'#**********************************************************')
call setline(11,'')
endif
endfunc
autocmd BufNewFile * normal G
EOF
...
|