調試 bash 腳本的技巧
- 加
-x參數運行 bash 腳本時,會顯示執行的語句
# 也可以在 demo.sh 中加上 set -x
bash -x demo.sh
- 設置環境變量,然后通過如上方式運行腳本時,會顯示行號
export PS4='+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '
參考
快速輸入歷史命令
輸入關鍵詞之后,連續使用ctrl+r快速切換
- In reverse-i-search (Ctrl+R ) ,Any method to switch between similar commands in history
- linux – 在反向搜索(Ctrl R),任何在歷史記錄中類似命令之間切換的方法
Ctrl+p/n 向上/向下 顯示緩存命令
ssh遠程執行命令
需要遠程到其他節點上執行一些 shell 命令,示例:
#! /bin/sh
set -x
ssh root@192.168.3.43 > /dev/null 2>&1 << EOF
cd /tmp
touch test.txt
exit
EOF
echo done
參考:
for循環
echo "Start Datetime:" $(date +"%Y-%m-%d %H:%M:%S")
for i in {1..3}
do
echo $i
git pull --all
if [ $? -ne 0 ]
then
echo "不成功"
# 睡眠2s
sleep 2
else
break
fi
done
echo "End Datetime:" $(date +"%Y-%m-%d %H:%M:%S")
參考:
if 判斷
判讀字符串(\(str)是否包含另一個字符串(\)str1):
方法1:
if [ `echo $str | grep -e '$str1'` ] ; then
echo yes
fi
方法2(如果$str1在判斷中直接使用字符串而不是變量,則不能加引號,如if [[ $str =~ ^dx ]]判讀字符串$str是否以dx開頭,^dx不能加引號):
if [[ $str =~ $str1 ]] ; then
echo yes
fi
比較兩個字符串是否相等的辦法是:
if [ "$test"x = "test"x ]; then
這里的關鍵有幾點:
- 使用單個等號,我發現,2個等號也 OK;
- 注意到等號兩邊各有一個空格:這是unix shell的要求
- 注意到
"$test"x最后的x,這是特意安排的,因為當$test為空的時候,上面的表達式就變成了x = testx,顯然是不相等的。而如果沒有這個x,表達式就會報錯:[: =: unary operator expected
參考:
從URL截取字段
默認去除url的最后斜線:
url=http://xxx/patch/xxx/xxxx/
tar_name=$(echo ${url%*/}|awk -F '/' '{print $NF}')
shell判斷字符串包含
if [[ $tar =~ tar.gz ]];then echo "包含";fi
Bash 加 -xe 表示什么意思
-e 使shell立即退出,某些東西會返回一個錯誤(這通常在shell腳本中用作故障保護機制),
-x 允許詳細執行腳本,你可以看到發生了什么
Shell 中的引號
https://blog.csdn.net/miyatang/article/details/8077123
Shell定義變量和給變量賦值
將命令的執行結果賦值給變量:
var='pwd'
# 或者
var=$(pwd)
將 Bash 的內置命令 read 讀入的內容賦值給變量:
echo -n "Enter var:";read var
通配符與特殊符號
| 符號 | 意義 |
|---|---|
| * | 代表0個到無窮多個任意字符 |
| ? | 代表一定有一個任意字符 |
| [] | 同樣是代表一定有一個在中括號內的字符(非任意字符)。例如,[abcd]代表一定有一個字符,可能是這四個中的一個 |
| [-] | 若減號在括號內,代表在編碼順序內的所有字符。例如,[0-9]代表0-9之間所有數字,因為數字的語系編碼是連續的 |
| [^] | 若中括號第一個字符是^,表示原向選擇,例如[^abc]代表一定有一個字符,只要是非a,b,c的其他字符就接收 |
示例:
- 找出
/etc/目錄下文件夾名字剛好有5個字母的文件名:ll -d /etc/????? - 找出
/etc/下面文件名含有數字的的文件名:ll -d /etc/*[0-9]* - 找出
/etc/下面文件名開頭非小寫字母的文件名:ll -d /etc/[^a-z]* - 將上面例子找到的文件復制到
/tmp中:`
bash 中的特殊符號
| 符號 | 內容 |
|---|---|
| # | 注釋符號 |
| \ | 轉義符號,將特殊字符或通配符還原成一般字符 |
| 豎線 | 管道 |
| ; | 連續命令執行分隔符,連續命令的界定 |
| ~ | 用戶的主文件夾 |
| $ | 使用變量的前導符 |
| & | 作業控制,將命令變成背景下工作 |
| ! | 邏輯運算意義上的“非” |
| >,>> | 數據流重定向,輸出導向,分別是“替換”與“累加” |
| <,<< | 數據流重定向,輸入導向 |
| '' | 單引號,不具有變量置換的功能 |
| "" | 具有變量置換的功能 |
| `` | 兩個重音符中間為可以先執行的命令,也可以使用$() |
| () | 中間為子shell的起始與結束 |
| {} | 中間為命令塊的組合 |
給Linux新增硬盤之后的操作
fdisk -l #查看磁盤情況,發現有磁盤沒有分區,比如是/dev/xvde
fdisk /dev/xvde #進行磁盤分區的操作
fdisk磁盤分區時,可以輸入m,會有提示:
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
我依次這么輸入的:
add a new partition:n
partion type:p
Partion number:分區個數 1
First sector默認值:Enter
Lase sector默認值:Enter
print the partion table:p
write table to disk and exit:w
分區完成之后,需要格式化
mkfs -t ext4 /dev/xvde1
將新建分區掛載到/data目錄下:
mkdir /data
mount /dev/xvde /data
掛載完畢,輸入df -hT可以查看到新建的分區
設置文件系統的自動掛載
vi /etc/fstab
添加/dev/xvde1 /data ext4 defaults 0 1
在 fstab 配置文件中加入掛載點之后其實就已經是開機自動掛載了,不需要用 mount 命令掛載。但是還是用 mount 實在,因為最后還是需要寫入/etc/fstab
第一段可以用分區名,也可以用 blkid 的方式獲取 UUID 的值
參考:
- www.jianshu.com/p/7b8c3509d5fe
- 玩轉 Linux 之:磁盤分區、掛載知多少?
- LVM
- Linux 磁盤管理
備份原有配置文件
只將不帶注釋的內容提取出來,作為配置文件
mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
-v 參數表示反選
修改主機名
查看Linux系統版本
lsb_release -a # 適用於所有Linux系統
cat /etc/os-release #推薦
cat /etc/redhat-release # 僅適用於Redhat系列的Linux系統
uname -a # 查看Linux內核
cat /proc/version # 查看Linux內核
顯示 shell 執行過程
set -x
如果想隱藏某一行的內容:
set -x
xxxx
set +x
yyyy
set -x
查看端口占用
[root@centos7.4 software]# netstat -apn 查看當前運行的所有進程的端口使用情況
[root@centos7.4 software]# netstat -apn | grep 端口號 查看指定端口使用情況
[root@centos7.4 software]# kill 指定端口的pid號 殺死指定進程(端口號對應的pid)
打印第X行
head -n X | tail -n 1
顯示 Path 環境變量
顯示你的環境變量PATH,一個目錄一行:
echo $PATH | tr : \\n
atime mtime ctime 的含義
- atime (access time) 訪問時間,表示文件最后被訪問的時間;
- mtime (modify time) 修改時間,文件內容被修改的最后時間,平常我們
ls -l查看文件是,顯示的就是 mtime; - ctime (change time) 變化時間,文件的元數據發生變化的時間,例如權限、所有者等,通俗來講,就是文件屬性或文件位置改動的時間;
利用 stat file_name 可以查看文件 「amc」time 。
echo "hello" >> issue
寫文件操作(>> 方式)不會導致 atime(訪問時間)的修改,但是 mtime 和 ctime 會發生修改。mtime 修改了我們可以理解的,畢竟我們修改了文件的,
那為何ctime也修改了呢, 仔細可以發現我們文件的大小發生了變化,也就是元數據發生了變化,所以ctime也是要變化的
參考:
重定向相關
FAQ
Q:Linux各目錄的作用
Q:http://blog.csdn.net/u011109356/article/details/54928955
/dev/xvda1 占滿
Linux好文
最后
- 本文作者: Michael翔
- 本文鏈接: https://michael728.github.io/2019/04/14/linux-useful-shell-commands-in-work/

