工做中經常使用的 Shell 命令及技巧

調試 bash 腳本的技巧

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

參考php

  • [耗子叔-如何調試BASH腳本](https://coolshell.cn/articles/1379.html/comment-page-1#comment-1965637

快速輸入歷史命令

輸入關鍵詞以後,連續使用ctrl+r快速切換html

Ctrl+p/n 向上/向下 顯示緩存命令linux

ssh遠程執行命令

須要遠程到其餘節點上執行一些 shell 命令,示例:git

#! /bin/sh
set -x

ssh root@192.168.3.43 > /dev/null 2>&1 << EOF
cd /tmp
touch test.txt
exit
EOF
echo done

參考:github

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")

參考:shell

if 判斷

判讀字符串(\(str)是否包含另外一個字符串(\)str1):centos

方法1:緩存

if [  `echo $str | grep -e '$str1'`  ] ; then
    echo yes
fi

方法2(若是$str1在判斷中直接使用字符串而不是變量,則不能加引號,如if [[ $str =~ ^dx ]]判讀字符串$str是否以dx開頭,^dx不能加引號):bash

if [[ $str =~ $str1 ]] ; then
    echo yes
fi

比較兩個字符串是否相等的辦法是:ssh

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

最後

  • 本文做者: Michael翔
  • 本文連接: https://michael728.github.io/2019/04/14/linux-useful-shell-commands-in-work/
相關文章
相關標籤/搜索