工作中常用的 Shell 命令及技巧


調試 bash 腳本的技巧

  • -x 參數運行 bash 腳本時,會顯示執行的語句
# 也可以在 demo.sh 中加上 set -x
bash -x demo.sh
  • 設置環境變量,然后通過如上方式運行腳本時,會顯示行號
export PS4='+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '

參考

快速輸入歷史命令

輸入關鍵詞之后,連續使用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 的值

參考:

備份原有配置文件

只將不帶注釋的內容提取出來,作為配置文件

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好文

最后

歡迎關注


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM