最近小白學習了shell腳本的基礎編程,感覺有必要對最近所學知識進行一 次簡單的總結,所以寫了這一篇博客,可能會有所不足。請大家指正,后期在學習過后,會進行完善的。
下面先說下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 實例
執(zhí)行順序: ~/.bashrc --> /etc/bashrc -->/etc/profile.d/*.sh
關于bash配置文件生效范圍
-
全局配置:
/etc/profile /etc/profile.d/*.sh /etc/bashrc -
個人配置:
~/.bash_profile ~/.bashrc
一、創(chuàng)建Shell腳本
利用vim等文本編輯工具創(chuàng)建文本文件 第一行必須包括shell 聲明序列:#!
例如:
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
-
shell 腳本的用途:
- 1、 自動化執(zhí)行常用命令
- 2、執(zhí)行系統(tǒng)管理和故障排除
- 3、 創(chuàng)建簡單的應用程序
- 4、創(chuàng)建文本或者文件
二、運行腳本文件
首先先給予文本文件權限:
chmod +x $name.sh
直接運行腳本文件./$PATH/$name.sh或者$shell ./$PATH/$name.sh,接下來就是小白簡單寫了一個簡單的腳本文件格式:
#!/bin/bash
[ $# -gt 1 ] && { echo " must be a arg ";exit;}
[ $# == 0 ] && read -p "please input script name: " name || name=$1
[ -e $name ] && { echo "the file is exist , please return the script and input another name"; exit ; }
touch $name
echo "#!/bin/bash
# author:wangnan
# mailbox:*********@163.com
# QQ:********
# blog:http://www.itdecent.cn/u/fb9ec5da4a64
# description:this is for wang
# echo " Your working directory is: $(pwd) "
# date date">"$name"
chmod +x "$name"
vim $name
unset name
這個腳本的功能是創(chuàng)建腳本模板,首先是判斷運行腳本時是否后加參數(shù),不加的話就退出,加的話,判斷是否名字相同,相同的話重新命名另外一個名字,之后自動添加執(zhí)行權限,并打開該腳本,unset
三、調試腳本
檢測腳本中的語法錯誤
bash -n /$PATH/$name.sh
調試執(zhí)行
bash -x /$PATH/$name.sh
四、邏輯運算
與運算
1 與 與 1 = 1
1 與 與 0 = 0
0 與 與 1 = 0
0 與 與 0 = 0
或運算
1 或 或 1 = 1
1 或 或 0 = 1
0 或 或 1 = 1
0 或 或 0 = 0
非運算 !
! 1 = 0
! 0 = 1
短路運算
短路與
&& 代表條件性的AND THEN
第一個為0 ,結果必定為0
第一個為1 ,第二個必須要參與運算
短路或
|| 代表條件性的OR ELSE
第一個為1 ,結果必定為1
第一個為0 ,第二個必須要參與運算
異或:^
異或的兩個值, 相同為假,不同為真
grep -q no_such_user /etc/passwd || echo 'No such user'
ping -c1 -W2 station1 &> /dev/null&& echo "station1 is up" || (echo 'station1 is unreachable'; exit 1)
五、利用 test 指令的測試功能
當我要檢測系統(tǒng)上面某些文件或者是相關的屬性時,利用 test 這個指令, 舉例來說,我要檢查 /testfile 文件是否存在時,使用:
test -e /testfile
執(zhí)行結果并不會顯示任何訊息,但最后我們可以通過 $? 或 && 及 || 來展現(xiàn)整個結果呢! 例如我們在將上面的例子改寫成這樣:
test -e /testfile && echo "exist" || echo "Not exist"
最終的結果可以告知我們是“exist”還是“Not exist”呢!那我知道 -e 是測試一個“文件”是否存在,如果還想要測試一下,還有很多選項可以供我們選擇!
- 文件測試
| 測試的標志 | 代表意義 |
|---|---|
| -e(同-a) | 該“文件名”是否存在? |
| -f | 該“文件名”是否存在且為文件(file) |
| -d | 該“文件名”是否存在且為目錄(directory) |
| -c | 是否存在且為字符設備文件(character device) |
| -d | 是否存在且為目錄文件 |
| -f | 是否存在且為普通文件 |
| -h(或-L) | 存在且為符號鏈接文件 |
| -p | 是否存在且為套接字文件 |
| -r | 是否存在且可讀 |
| -w | 是否存在且可寫 |
| -x | 是否存在且可執(zhí)行 |
| -u | 是否存在且擁有suid 權限 |
| -g | 是否存在且擁有sgid 權限 |
| -k | 是否存在且擁有sticky 權限 |
| -s | 是否存在且非空 |
| -t fd | fd表示文件描述符是否已經打開且與某終端相關 |
| -N | 文件自動上一次被讀取之后是否被修改過 |
| -O | 當前有效用戶是否為文件屬主 |
| -G | 當前有效用戶是否為文件屬組 |
- 字符串測試
| 測試的標志 | 代表意義 |
|---|---|
| == | 是否等于; |
| > | ascii 碼是否大于ascii碼 |
| < | 是否小于 |
| != | 是否不等于 |
| =~ | 左側字符串是否能夠被右側的PATTERN所 所 匹配()Ps: 此表達式一般用于[[ ]] 中;擴展的正則表達式) |
| -z | 字符串是否為空,空為真,不空為假 |
| -n | 字符串是否不空,不空為真,空為假 |
- 數(shù)值測試
| 測試的標志 | 代表意義 |
|---|---|
| -gt | 是否大于 |
| -ge | 是否大于等于 |
| -eq | 是否等于 |
| -ne | 是否不等于 |
| -lt | 是否小于 |
| -le | 是否 |
- 雙目測試
| 測試的標志 | 代表意義 |
|---|---|
| -ef | 是否指向同一個設備上的相同inode |
| -nt | 是否新于前一個文件 |
| -ot | 是否舊于前一個文件 |
filetest1 -ef filetest2: filetest1 與filetest2 是否指向同一個設備上的相同inode
filetest1 -nt filetest2: filetest1 是否新于 于filetest2
filetest1 -ot filetest2: filetest1 是否舊于 于filetest2
Bash 的組合測試條件
第一種方式:
COMMAND1 && COMMAND2 并且
COMMAND1 || COMMAND2 或者
! COMMAND 非 非
如:[[ -r FILE ]] && [[ -w FILE ]]第二種方式:
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION
必須使用測試命令進行示例:
[ -z “$HOSTNAME” -o $HOSTNAME "=="localhost.localdomain" ] && hostname www.magedu.com
[ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab