Linux常用Shell腳本知多少

2021-03-02 碼農沉思錄

原文:http://www.cse.unsw.edu.au/~cs2041/12s2/lec/shell/examples.notes.html

在運維中,尤其是linux運維,都知道腳本的重要性,腳本會讓我們的 運維事半功倍,所以學會寫腳本是我們每個linux運維必須學會的一門功課,這裡收藏linux運維常用的腳本。如何學好腳本,最關鍵的是就是大量的練習 和實踐。根據以下腳本我們可以拓展,這樣我們提高的很快!舉一反三!

小夥伴要是不熟悉linux的話可以在公眾號內回復 「linux」 獲取linux的教程 之後咱們再來回過頭來學一學腳本

1.用Shell編程,判斷一文件是不是字符設備文件,如果是將其拷貝到 /dev 目錄下。

參考程序:

#!/bin/sh  FILENAME=  echo 「Input file name:」  read FILENAME  if [ -c "$FILENAME" ]  then  cp $FILENAME /dev  fi

2.設計一個shell程序,添加一個新組為class1,然後添加屬於這個組的30個用戶,用戶名的形式為stdxx,其中xx從01到30。

參考答案:

#!/bin/sh  i=1  groupadd class1  while [ $i -le 30 ]  do  if [ $i -le 9 ] ;then  USERNAME=stu0${i}  else  USERNAME=stu${i}  fi  useradd $USERNAME  mkdir /home/$USERNAME  chown -R $USERNAME /home/$USERNAME  chgrp -R class1 /home/$USERNAME  i=$(($i+1))  do

3.編寫shell程序,實現自動刪除50個帳號的功能。帳號名為stud1至stud50。

 

參考程序:

#!/bin/sh  i=1  while [ $i -le 50 ]  do  userdel -r stud${i}  i=$(($i+1 ))  done

4.某系統管理員需每天做一定的重複工作,請按照下列要求,編制一個解決方案:

(1)在下午4 :50刪除/abc目錄下的全部子目錄和全部文件;
(2)從早8:00~下午6:00每小時讀取/xyz目錄下x1文件中每行第一個域的全部數據加入到/backup目錄下的bak01.txt文件內;
(3)每逢星期一下午5:50將/data目錄下的所有目錄和文件歸檔並壓縮為文件:backup.tar.gz;
(4)在下午5:55將IDE接口的CD-ROM卸載(假設:CD-ROM的設備名為hdc);
(5)在早晨8:00前開機後啟動。

參考答案:

解決方案:
(1)用vi創建編輯一個名為prgx的crontab文件;
(2)prgx文件的內容:

50 16 * * * rm -r /abc/*  0 8-18/1 * * * cut -f1 /xyz/x1 >;>; /backup/bak01.txt  50 17 * * * tar zcvf backup.tar.gz /data  55 17 * * * umount /dev/hdc

(3)由超級用戶登錄,用crontab執行 prgx文件中的內容:
root@xxx:#crontab prgx;在每日早晨8:00之前開機後即可自動啟動crontab。

5.設計一個shell程序,在每月第一天備份並壓縮/etc目錄的所有內容,存放在/root/bak目錄裡,且文件名為如下形式yymmdd_etc,yy為年,mm為月,dd為日。Shell程序fileback存放在/usr/bin目錄下。

 

參考答案:

(1)編寫shell程序fileback:

#!/bin/sh  DIRNAME=`ls /root | grep bak`  if [ -z "$DIRNAME" ] ; then  mkdir /root/bak  cd /root/bak  fi  YY=`date +%y`  MM=`date +%m`  DD=`date +%d`  BACKETC=$YY$MM$DD_etc.tar.gz  tar zcvf $BACKETC /etc  echo 「fileback finished!」

(2)編寫任務定時器:

echo 「0 0 1 * * /bin/sh /usr/bin/fileback」 >; /root/etcbakcron  crontab /root/etcbakcron  或使用crontab -e 命令添加定時任務:  0 1 * * * /bin/sh /usr/bin/fileback

6.有一普通用戶想在每周日凌晨零點零分定期備份/user/backup到/tmp目錄下,該用戶應如何做?

 

參考答案:

 

(1)第一種方法:

用戶應使用crontab –e 命令創建crontab文件。格式如下:  0 0 * * sun cp –r /user/backup /tmp

(2)第二種方法:
用戶先在自己目錄下新建文件file,文件內容如下:

0 * * sun cp –r /user/backup /tmp

然後執行 crontab file 使生效。

 
7.設計一個Shell程序,在/userdata目錄下建立50個目錄,即user1~user50,並設置每個目錄的權限,其中其他用戶的權限為:讀;文件所有者的權限為:讀、寫、執行;文件所有者所在組的權限為:讀、執行。

 

參考答案: 建立程序 Pro16如下:

#!/bin/sh  i=1  while [ i -le 50 ]  do  if [ -d /userdata ];then  mkdir -p /userdata/user$i  chmod 754 /userdata/user$i  echo 「user$i」  let 「i = i + 1″ (或i=$(($i+1))  else  mkdir /userdata  mkdir -p /userdata/user$i  chmod 754 /userdata/user$i  echo 「user$i」  let 「i = i + 1″ (或i=$(($i+1))  fi  done

8、mysql備份實例,自動備份mysql,並刪除30天前的備份文件

#!/bin/sh  #auto backup mysql  #wugk  2012-07-14  #PATH DEFINE  BAKDIR=/data/backup/mysql/`date +%Y-%m-%d`  MYSQLDB=www  MYSQLPW=backup  MYSQLUSR=backup  if[ $UID -ne 0 ];then  echo This script must use administrator or root user ,please exit!  sleep 2  exit 0  fi  if[ ! -d $BAKDIR ];then  mkdir -p $BAKDIR  else  echo This is $BAKDIR exists ,please exit ….  sleep 2  exit  fi  ###mysqldump backup mysql  /usr/bin/mysqldump -u$MYSQLUSR -p$MYSQLPW -d $MYSQLDB >/data/backup/mysql/`date +%Y-%m-%d`/www_db.sql  cd $BAKDIR ; tar -czf  www_mysql_db.tar.gz *.sql  cd $BAKDIR ;find  . -name 「*.sql」 |xargs rm -rf[ $? -eq 0 ]&&echo 「This `date +%Y-%m-%d` RESIN BACKUP is SUCCESS」  cd /data/backup/mysql/ ;find . -mtime +30 |xargs rm -rf

9、自動安裝Nginx腳本,採用case方式,選擇方式,也可以根據實際需求改成自己想要的腳本

#!/bin/sh  ###nginx install shell  ###wugk 2012-07-14  ###PATH DEFINE  SOFT_PATH=/data/soft/  NGINX_FILE=nginx-1.2.0.tar.gz  DOWN_PATH=http://nginx.org/download/  if[ $UID -ne 0 ];then  echo This script must use administrator or root user ,please exit!  sleep 2  exit 0  fi  if[ ! -d $SOFT_PATH ];then  mkdir -p $SOFT_PATH  fi  download ()  {  cd $SOFT_PATH ;wget $DOWN_PATH/$NGINX_FILE  }  install ()  {  yum install pcre-devel -y  cd $SOFT_PATH ;tar xzf $NGINX_FILE ;cd nginx-1.2.0/ &&./configure –prefix=/usr/local/nginx/ –with-http_stub_status_module –with-http_ssl_module  [ $? -eq 0 ]&&make &&make install  }  start ()  {  lsof -i :80[ $? -ne 0 ]&&/usr/local/nginx/sbin/nginx  }  stop ()  {  ps -ef |grep nginx |grep -v grep |awk 『{print $2}』|xargs kill -9  }  exit ()  {  echo $? ;exit  }  ###case menu #####  case $1 in  download )  download  ;;  install )  install  ;;  start )  start  ;;  stop )  stop  ;;  * )  echo 「USAGE:$0 {download or install or start or stop}」  exit  esac

10、批量解壓tar腳本,批量解壓zip並且建立當前目錄。

#!/bin/sh  PATH1=/tmp/images  PATH2=/usr/www/images  for i in `ls ${PATH1}/*`  do  tar xvf  $i  -C $PATH2  done

這個腳本是針對所有tar文件在一個目錄,但是實際情況中,有可能在下級或者更深的目錄,我們可以使用find查找

#!/bin/sh  PATH1=/tmp/images  PATH2=/usr/www/images  for i in `find  $PATH1  -name  」*.tar」 `  do  tar xvf  $i  -C $PATH2  done

如何是zip文件,例如123189.zip 132342.zip 等等批量文件,默認unzip直接解壓不帶自身目錄,意思是解壓123189.zip完當前目錄就是圖片,不能創建123189目錄下並解壓,可以用shell腳本實現

#!/bin/sh  PATH1=/tmp/images  PATH2=/usr/www/images  cd $PATH1  for i in `find  . -name  」*.zip」|awk  -F.  {print $2} `  do  mkdir -p   PATH2$i  unzip -o  .$i.zip  -d   PATH2$i  done

ssh 批量上傳文件

上傳文件大多數用的是ftp,但是用ftp有一點不好,就是本地和遠程的目錄要對應,這樣就要在多個目錄下去切換,這樣挺麻煩的,如果不注意的話,很有可能傳錯。所以想了個辦法利用scp來批量上傳文件或者目錄。

 

一,scp上傳不要輸入密碼

如果要用scp來上傳文件,第一步就要去掉scp上傳時要輸入密碼。要不然就沒辦法批量上傳了。

 

二,ssh批量上傳腳本

 

1,要上傳的文件列表放到一個test文件中

root@ubuntu:/home/zhangy# cat test    /home/zhangy/test/aaa    /home/zhangy/test/nginx.conf    /home/zhangy/test/test.sql    /home/zhangy/test/pa.txt    /home/zhangy/test/password

上面就要上傳的文件。

 

2,批量上傳的腳本

 

vim file_upload.sh

#!/bin/sh  DATE=`date +%Y_%m_%d_%H`  if [ $1 ]  then    for file in $(sed '/^$/d' $1)     //去掉空行    do      if [ -f $file ]                 //普通文件      then        res=`scp $file $2:$file`      //上傳文件        if [ -z $res ]                //上傳成功        then          echo $file >> ${DATE}_upload.log   //上傳成功的日誌        fi      elif [ -d $file ]              //目錄      then        res=`scp -r $file $2:$file`        if [ -z $res ]        then          echo $file >> ${DATE}_upload.log        fi      fi    done  else    echo "no file" >> ${DATE}_error.log  fi

上傳成功後,返回的是一個空行,上傳不成功,什麼都不返回

 

3,上傳的格式

./file_upload.sh test 192.168.1.13

test是上傳列表文件,192.168.1.13文件要傳到的地方。

其他腳本等

1. 轉換文件大小寫:

#!/bin/sh   # lowerit  # convert all file names in the current directory to lower case  # only operates on plain files--does not change the name of directories  # will ask for verification before overwriting an existing file  for x in `ls`  do      if [ ! -f $x ]; then          continue      fi      lc=`echo $x  | tr '[A-Z]' '[a-z]'`      if [ $lc != $x ]; then          mv -i $x $lc      fi  done

2. 看網站 Watch a Website

% watch_website.sh http://ticketek.com.au/ 'Ke[sS$]+ha' andrewt@cse.unsw.edu.au  repeat_seconds=300  #check every 5 minutes  if test $# = 3  then      url=$1      regexp=$2      email_address=$3  else      echo "Usage: $0 <url> <regex>" 1>&2      exit 1  fi  while true  do      if wget -O- -q "$url"|egrep "$regexp" >/dev/null      then          echo "Generated by $0" | mail -s "$url now matches $regexp" $email_address          exit 0      fi      sleep $repeat_seconds  done

3. 轉GIF到PNG convert GIF files to PNG

if [ $# -eq 0 ]  then      echo "Usage: $0 files..." 1>&2      exit 1  fi  if ! type giftopnm 2>/dev/null  then      echo "$0: conversion tool giftopnm not found " 1>&2      exit 1  fi  # missing "in ..." defaults to in "$@"  for f  do      case "$f" in      *.gif)          # OK, do nothing          ;;      *)          echo "gif2png: skipping $f, not GIF"          continue          ;;      esac      dir=`dirname "$f"`      base=`basename "$f" .gif`      result="$dir/$base.png"      giftopnm "$f" | pnmtopng > $result && echo "wrote $result"  done

4.  計數 Counting

if test $# = 1  then      start=1      finish=$1  elif test $# = 2  then      start=$1      finish=$2  else      echo "Usage: $0 <start> <finish>" 1>&2      exit 1  fi  for argument in "$@"  do      if echo "$argument"|egrep -v '^-?[0-9]+$' >/dev/null      then          echo "$0: argument '$argument' is not an integer" 1>&2          exit 1      fi  done  number=$start  while test $number -le $finish  do      echo $number      number=`expr $number + 1`    # or number=$(($number + 1))  done

5. 字頻率 Word Frequency

sed 's/ /\n/g' "$@"|      # convert to one word per line  tr A-Z a-z|               # map uppercase to lower case  sed "s/[^a-z']//g"|       # remove all characters except a-z and '    egrep -v '^$'|             # remove empty lines  sort|                     # place words in alphabetical order  uniq -c|                  # use uniq to count how many times each word occurs  sort -n                   # order words in frequency of occurrance

相關焦點

  • Linux常用Shell腳本,值得學習及收藏
    在運維中,尤其是linux運維,都知道腳本的重要性,腳本會讓我們的 運維事半功倍,所以學會寫腳本是我們每個linux運維必須學會的一門功課,這裡收藏
  • Linux——Shell腳本的應用1(基礎)
    Shell腳本的應用(基礎)簡介:隨著linux系統在企業中的應用越來越多,伺服器的自動化管理也變得越來越重要。在linux伺服器的自動化維護工作中,除了計劃任務的設置以外,shell腳本的應用也是非常重要的一部分。
  • Linux命令行與Shell腳本編程學習筆記20
    trap命令允許你來指定shell腳本要觀察哪些linux信號並從shell中攔截。如果腳本收到了trap命令中列出的信號,它會阻止它被shell處理,而在本地處理它。2. trap命令的格式是: trap commands signals3. 當&符放到命令後時,它會將命令和bash shell分離開來,並將它作為系統上的獨立後臺進程運行。
  • Linux中Shell腳本基礎筆記
    shell腳本都是以"#!"作為開頭。這是腳本開始的標記,它是告訴linux系統執行該腳本文件需要使用相應的解釋器,緊挨著的/bin/bash指定了解釋器的具體路徑。shell主要用#作為注釋標記。後面可以加腳本的注釋,建議寫shell腳本要根據情況多寫注釋,便於以後腳本的維護。shell腳本的運行方式:1、可以在shell腳本第一行加上"#!/bin/bash"的話。可以按照以下方式執行:bash test.sh #要保證目錄中存在該腳本文件。2、給腳本加上可執行的權限,然後使用".
  • 【Linux】shell高級編程視頻教程(含經典案例)
    shell的最強大的重要特性是它自身就是一個解釋型的程序設計語言,shell 程序設計語言支持在高級語言裡所能見到的絕大多數程序控制結構,比如循環,函數,變量和數組。shell 程式語言很易學,並且一旦掌握後它將成為你的得力工具。任何在提示符下能鍵入的命令都能放到一個可執行的shell程序裡,這意味著用shell語言能簡單地重複執行某一任務。
  • 玩轉Linux - shell 編程基礎(一)
    簡述使用 linux 就離不開 shell,那麼也就是說也離不開 shell 編程。
  • shell腳本極簡教程
    上面提到過,Shell是一種腳本語言,那麼,就必須有解釋器來執行這些腳本。Unix/Linux上常見的Shell腳本解釋器有bash、sh、csh、ksh等,習慣上把它們稱作一種Shell。我們常說有多少種Shell,其實說的是Shell腳本解釋器。
  • 《Linux shell腳本攻略》限免
    任何初學者都可以在網上輕鬆獲取Linux、Linux shel相關的基礎教程,而就如何運用shell來解決現實世界中的問題,相關的知識和技巧大多都散落在論壇或博客中,要麼不夠全面系統,要麼不易查找。如果你也有此煩惱,不如看看《Linux shell腳本攻略》這本書。
  • Linux shell腳本編程入門系列一:認識shell腳本
    1、什麼是shell腳本將多個shell命令按語法組合在一起,並保存在文本文件中即得到我們所說的shell腳本(shell script)。shell腳本可以方便地與系統交互,完成系統管理以及批處理任務。shell處於作業系統與應用之間,起到橋梁的作用。
  • linux shell 腳本入門
    Linux 腳本編寫基礎1.1 語法基本介紹1.1.1 開頭程序必須以下面的行開始(必須方在文件的第一行):#!/bin/sh符號#!用來告訴系統它後面的參數是用來執行該文件的程序。在這個例子中我們使用/bin/sh來執行程序。當編輯好腳本時,如果要執行該腳本,還必須使其可執行。
  • linux系統shell腳本基本及變量
    shell是啥1、腳本語言,可以用來編寫腳本。shell script shell腳本(劇本),面向過程的語言。腳本-->一條條命令的羅列。[]括號中是字符集合,不管字符集合中有多少個字符,只匹配字符集合中的一個字符。[abc][abc] aa ab ac ba bb bc ca cb cc# touch a{a,b,c,d}.txt# ls a[abc].txt[-]-表示範圍。
  • 為什麼Shell腳本執行不成功?原來是這樣
    Shell腳本語言是linux系統中內置的一門非常強大的語言,非常善於處理作業系統層面的應用,我們從網上下載的很多應用的安裝和啟動往往都是用Shell腳本語言寫的。可是初步開始使用linux的小夥伴是不是經常會有些應用下載下來,不知道怎麼安裝或者啟動,甚至有的根據作者的安裝說明都操作錯誤。
  • Linux作業系統之Shell程序設計
    子Shell運行時讀取該文件並執行其內容,因此腳本文件不必有執行權限。這種方法常用於運行一個其他版本的Sbell腳本。假如當前Shell是bash,而chello是用C Shell語言寫的腳本,則要執行這個腳本時可以用csh chello命令啟動一個csh進程來執行它。
  • shell-安裝jdk腳本
    前言在Linux安裝jdk是很簡單的事情,那就讓shell腳本去做吧!安裝到oracle官網的歸檔網址下載需要的jdk壓縮包,並放到腳本所在的目錄,然後cd到腳本目錄執行就可以,這裡是1.8.172版本為例:http://www.oracle.com/technetwork/java/archive-139210.html#!
  • Linux Shell腳本執行超時怎麼辦?
    在shell裡會有一種不太常見的情況,就是腳本有時候會出現超時的現象。一般來說遇到這種問題,我們都會簡單粗暴的採用下面這種腳本來當「超時看門狗「: 這個腳本搭配兩個變量使用的話,監控一點小代碼還算OK,但是它的邏輯還是比較粗糙,比如如果在這個腳本執行的時候,又有了一個新的process在後臺啟動,那麼kill掉的就是新的process,而本應該停止的腳本還是在後臺肆無忌憚的跑著
  • 精心匯總的 24 道 shell 腳本面試題
    示例如下所示:# chsh <用戶名> -s <新shell># chsh linuxtechi -s /bin/shQ:3 可以在shell腳本中使用哪些類型的變量?fifiQ:6 shell腳本中「$?」標記的用途是什麼?答:在寫一個shell腳本時,如果你想要檢查前一命令是否執行成功,在if條件中使用「$?」可以來檢查前一命令的結束狀態。
  • 不懂什麼是shell腳本?看完本文你一定就懂了
    不管是我們瀏覽的各種新聞媒體還是玩的各種遊戲,都是由各網際網路公司內部的伺服器提供的服務,而這些伺服器上安裝的作業系統,至少有90%是建立在linux系統上的,所以linux系統的人才也是網際網路行業內比較搶手的人才,各種培訓班更是層出不窮!小編本人也非常喜歡看各種linux系統的文章,其中有一個詞叫做shell,小編開始就是不明白什麼意思。
  • 什麼是Shell腳本?為什麼要學習Shell?
    Shell腳本語言是實現Linux/UNIX系統管理及自動化運維所必備的重要工具, Linux/UNIX系統的底層及基礎應用軟體的核心大都涉及Shell腳本的內容。每一個合格 的Linux系統管理員或運維工程師,都需要能夠熟練地編寫Shell腳本語言,並能夠閱 讀系統及各類軟體附帶的Shell腳本內容。
  • linux實戰案例-讓你的shell編程更精進一步
    #linux知識匯總與分享#linux伺服器下的日常日誌處理功能01首先我們先創建幾個文件利用我們之前學的shell腳本批量創建幾個文件(這裡我們創建10個)第一步:touch createFileLog.sh第二步:vi createFileLog.sh
  • 編寫Linux Shell腳本的最佳實踐
    前言 由於工作需要,最近重新開始拾掇shell腳本。雖然絕大部分命令自己平時也經常使用,但是在寫成腳本的時候總覺得寫的很難看。而且當我在看其他人寫的腳本的時候,總覺得難以閱讀。