1. 程式人生 > >Shell腳本基礎(一)

Shell腳本基礎(一)

2.6 x86 histsize bash 數據 隨著 顯示 echo 保存

前言:隨著Linux系統在企業中的應用越來越多,服務器的自動化管理也越來越變得重要,在一些復雜的Linux維護工作中,大量的重復性的輸出和交互式操作不但費時費力,而且容易出錯,所以Shell腳本,可以批量處理,自動化完成一系列維護工作,大大減輕管理員的負擔。

一,Shell腳本基礎知識
1,編寫第一個shell腳本
1),vim first.sh
[root@localhost ~]# mkdir /shell //創建一個shell目錄
[root@localhost ~]# vim first.sh //新建first。sh文件
#!/bin/bash
cd /boot/
pwd
ls -lh vml

2),設置執行權限並執行
[root@localhost /]# chmod +x first.sh //添加可執行權限
[root@localhost /]# ./first.sh //直接運行腳本文件
/boot
-rwxr-xr-x. 1 root root 4.0M 11?.22 2013 vmlinuz-2.6.32-431.el6.x86_64
[root@localhost /]#
2.為腳本添加註釋,友好輸出,更容易讀懂
1)
[root@localhost ~]# vim first.sh
~
#!/bin/bash
#this is my first shell-scipt
cd /boot
echo "當前的目錄位於:"
pwd
echo "其中以vml開頭的文件包括:"
ls -lh vml

2),執行./first.sh後如下
[root@localhost ~]# ./first.sh
當前的目錄位於:
/boot
其中以vml開頭的文件包括:
-rwxr-xr-x. 1 root root 4.0M 11?.22 2013 vmlinuz-2.6.32-431.el6.x86_64
[root@localhost ~]#
3,重定向操作
在Linux維護中,可以改變輸入、輸出內容的方向,而不是使用默認的標準輸出、輸出設備(鍵盤和顯示器),這種操作成為“重定向”。
1),>表示重定向輸出,>>表示重定向追加
[root@localhost ~]# uname -p > kernel.txt //將當前主機的CPU類型信息保存到kernel.txt文件中
[root@localhost ~]# cat kernel.txt
x86_64
[root@localhost ~]# uname -r >> kernel.txt //將內核版本追加到kernel.txt文件中
[root@localhost ~]# cat kernel.txt
x86_64
2.6.32-431.el6.x86_64
[root@localhost ~]#
2),重定向輸入,<表示重定向輸入
[root@localhost ~]# vim pass.txt //添加初始密碼串內容“123456”
[root@localhost ~]# useradd chenpeng //添加用戶“chenepng”
[root@localhost ~]# passwd --stdin chenpeng < pass.txt
//從pass.txt文件中取密碼
Changing password for user chenpeng.
passwd: all authentication tokens updated successfully.
3),錯誤重定向,可用來收集程序執行的錯誤信息,為排錯提供依據,例如:執行以下操作可以將使用tar命令備份時出現的錯誤信息保存到error.log文件中
[root@localhost ~]# tar kcf /noendir/etc/.tgz /etc/ 2> error.log
[root@localhost ~]# cat error.log
tar: /noendir/etc/.tgz:無法. open:沒有那個文件或目錄
tar: Error is not recoverable: exiting now
4)&>操作符可以將兩類輸出信息保存到同一個文件,例如,在編譯源碼包的自動化腳本中,若要忽略make,make install的操作的過程信息,可以將其定向到空文件/dev/null
首先下載httpd軟件到本機,然後執行Vim httpd_install.sh,並輸入如下內容:
[root@localhost ~]# vim httpd_install.sh
#!/bin/bash
cd /usr/src/httpd-2.2.17/
./configure --prefix=/usr/local/httpd --enable-so &> /dev/null
make &> /dev/null
make install &> /dev/null
設置權限chmod +x httpd_install.sh
最後執行./httpd_install.sh(註意/前的點)
4、管道操作
例子:使用grep命令查詢使用/bin/bash作為shell的用戶名稱時,會輸出符合條件的整行內容,在此基礎上可以結合管道操作與Awk命令做進一步過濾,只輸出用戶名和登錄shell列。
1)提取之前的正常效果
[root@localhost /]# grep "/bin/bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
jerry:x:500:500::/home/jerry:/bin/bash
chenpeng:x:501:501::/home/chenpeng:/bin/bash
2)提取之後的效果,只顯示用戶名和shell列
[root@localhost /]# grep "/bin/bash$" /etc/passwd | awk -F: ‘{print $1,$7}‘
root /bin/bash
jerry /bin/bash
chenpeng /bin/bash
3)再例如:顯示磁盤已用的百分比,可以執行以下操作,其中用到了df, grep,awk命令和管道操作
[root@localhost /]# df -hT | grep "/$" | awk ‘{print $6}‘
11%
二、使用shell變量
1、自定義變量:只在自己的shell環境中有效
1)定義新的變量和引用變量
Bash中的變量操作相對比較簡單,不像其他高級編程語言(如C/C++,Java等)那麽復雜。在定義一個新的變量時,一般不予要提前進行聲明,而是直接指定變量名稱並賦予初始值(內容)即可,
定義變量的基本格式為“變量值=變量值”,等號兩邊沒有空格。變量的名稱需以字母或者下劃線開頭,名稱中不要包含特殊字符(如+、—、、/、.%、 &、 #、)
例如,若要定義一個名為“Product”的變量(值為Benet)和一個名為“Version”的變量(值為5.0),和查看引用變量的值,可執行一下操作:
[root@localhost /]# product=benet
[root@localhost /]# version=5.0
[root@localhost /]# echo $product
benet
[root@localhost /]# echo $product $version
benet 5.0
2、變量賦值的特殊操作
1)雙引號的作用:賦值的內容包含空格時,例如:
[root@localhost /]# benet=benet 5.0 //錯誤的賦值
-bash: 5.0: command not found
[root@localhost /]# benet="benet 5.0" //正確的賦值
[root@localhost /]# echo $benet
benet 5.0
在雙引號範圍內,使用"$"符號可以引用其他的變量值
[root@localhost /]# ACCP="ACCP $Version" //以變量的值進行賦值
[root@localhost /]# Version=4.0
[root@localhost /]# echo $ACCP
ACCP 4.0
3)反撇號()的作用:用於將某個命令的輸出結果賦值給變量,例如:<br/>[root@localhost /]# ls -lhwhich useradd`
-rwxr-x---. 1 root root 101K 12?. 8 2011 /usr/sbin/useradd
4)$()的作用:可以代替反撇號,解決嵌套問題,因為反撇號不能實現嵌套,例如:查詢提供useradd命令程序的軟件包所安裝的配置文件位置.
[root@localhost /]# rpm -qc $(rpm -qf $(which useradd))
/etc/default/useradd
/etc/login.defs
5)read命令的作用:用來提示用戶輸入信息,例如:
[root@localhost /]# read todir1
/opt/backup/
[root@localhost /]# echo $todir1
/opt/backup/
[root@localhost /]# read -p "請指定備份存放目錄:" todir2
請指定備份存放目錄:/opt/backup
[root@localhost /]# echo $todir2
/opt/backup
3、設置變量的作用範圍
新定義的變量只在當前shell有效,如果想進入新的shell環境同樣有效,就需要使用export命令將變量導出為“全局變量”
[root@localhost /]# echo "$product $version"
benet 4.0
[root@localhost /]# export product version
[root@localhost /]# bash
[root@localhost /]# echo "$product $version"
benet 4.0
也可以在export導出全局變量的同時,也可以為變量賦值,例如:
[root@localhost /]# export web="www.google.com"
[root@localhost /]# echo $web
www.google.com
4,數值變量的運算
常用的幾種運算符:
+:加法計算
—:減法計算
*:乘法計算,註意不能僅用“
”符號,否則將被當成文件通配符。
/:除法計算
%:求模運算,又稱為取余運算,用來計算數值相處後的余數
示例如下:
[root@localhost /]# x=35
[root@localhost /]# y=16
[root@localhost /]# expr $x + $y
51
[root@localhost /]# expr $x - $y
19
[root@localhost /]# expr $x * $y
560
[root@localhost /]# expr $x / $y
2
[root@localhost /]# expr $x % $y
3
若要將運算的結果賦值給其他變量,可以結合命令替換操作(使用反撇號),例如,計算Y的3次方,並將結果賦值給ycube
[root@localhost /]# ycube=expr $y \* $y \* $y
[root@localhost /]# echo $ycube
4096
三、特殊的shell變量
1、環境變量
環境變量系統安裝好了就存在,不用創建,可以直接使用,我們先查看一下:
[root@localhost /]# env
HOSTNAME=localhost.localdomain
version=4.0
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
..................
我們可以把腳本直接添加到$PATH搜索路徑中去,這樣執行腳本的時候就不用加./了
[root@localhost ~]# cd /shell
[root@localhost shell]# ls
first.sh
[root@localhost shell]# first.sh //直接執行時找不到命令
-bash: first.sh: command not found
[root@localhost shell]# PATH="$PATH:/shell" //將//root添加到搜索路徑
[root@localhost shell]# echo $PATH //查看修改後的搜索路徑
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/shell
[root@localhost shell]# first.sh //直接以文件名運行腳本
當前目錄位於:
/boot
其中以vml開頭的文件包括
-rwxr-xr-x. 1 root root 4.0M 11?.22 2013 vmlinuz-2.6.32-431.el6.x86_64
環境變量的全局配置文件為/etc/profile,作用於所有用戶,例如:將歷史記錄命令條數改為200條,只針對root用戶
[root@localhost ~]# vim /root/.bash_profile
............//省略部分內容
export HISTSIZE=200 //需要添加的
只需要添加上面的最後一行,然後執行source /root/.bash_profile使之生效。
[root@localhost ~]# source /root/.bash_profile //讀取並執行文件中的設置
[root@localhost ~]# history | wc -l //修改後的歷史命令跳數
110
2、位置變量,例如求兩個數的和
[root@localhost ~]# vim adder2num.sh
#!/bin/bash
sum=expr $1 + $2
echo "$1 + $2 = $sum"
[root@localhost /]# ./adder2num.sh 1 1
1 + 1 = 2
3、預定義變量,系統安裝好之後就有,不能創建,只能使用,例如:$#表示命令行中位置參數的個數,$表示所有位置參數的內容,$?表示前一條命令執行後的返回狀態,返回0表示正確。$0表示當前執行的腳本或程序的名稱。
例如:制作備份數據腳本
[root@localhost /]# vim mybak.sh
#!/bin/bash
tarfile=beifen-date +$s.tgz
tar zcf $tarfile $
&> /dev/null
echo "已執行 $0 腳本"
echo "共完成 $# 個對象的備份"
echo "具體內容包括: $"
執行腳本./mybak.sh,備份兩個文件
[root@localhost /]# ./mybak.sh /etc/passwd /etc/shadow
已執行 ./mybak,.sh 腳本,
共完成 2 個對象的備份
具體包括:/etc/passwd /etc/shadow
查看備份結果
[root@localhost /]# ls -lh beifen-

-rw-r--r-- 1 root root 3.4k Aug 17 23:29 beifen-1401972022.tgz
-rw-r--r-- 1 root root 3.4k Aug 17 23:29 beifen-1401972038.tgz

Shell腳本基礎(一)