邏輯+系統管理命令

 

1、shell與bash區別python

shell  命令解釋器:衆多解釋器的總括ksh、sh、tcsh、csh、bashlinux

bash  命令解釋器: 屬於某一我的,或屬於某家公司開發出來的產品,衆多解釋器中的一個,具體產品shell

~存放位置  #cat  /etc/shellsvim

/usr/bin/bash快捷鍵 = /bin/bashbash

~用戶解釋器:useradd  -s  /bin/bash  默認app

#usermod  -s  /bin/tcsh   永久改解釋器運維

#tcsh  回車 臨時改解釋器   ssh

#exit  退出該解釋器函數

~裝解釋器  yum  -y insall  kssh    不支持快捷鍵,沒有上下左右鍵post

#cat  /etc/shells

#ksh 回車       #ls       #ls  -- color

###############################################

2、bash特色

運維工做,人工---自動化

腳本運行-cpu,內存;用戶白天訪問,腳本晚上運行較好

@快捷鍵  ctrl +L    +D   +W   +E命令的行尾   +A 命令的行首

@tab鍵:命令、路徑、文件、選項-默認不支持-要裝bash-completion包

公司最小化mini安裝默認不支持tab鍵-要裝bash-completion包

公司不容許隨便裝包改密、裝包需先申請--gcc先源碼包編譯、安裝再卸載

@命令歷史:方便上下鍵,默認1000條,50-100條

/etc/profile   HISTSIZE=50,history  -c清空歷史記錄

真實機的PXE的安裝後腳本Post-scripts、虛擬機的模版裏先改命令歷史

PXE pre-Scripts

PXE post-Scripts

@別名:#alias 查看默認別名 ;  \cp 去掉別名 ;  iinteracter交互式;alias 查看=‘ls  --color’  支持中文;

環境變量: /etc/profile 全局文件,對全部用戶有效;~/.bash_profile用戶文件 ,指定用戶有效。

/etc/bashrc放的是 函數、別名

@輸入輸出:標準輸出1>  不寫默認、錯誤輸出2&錯誤正確都輸出

[root@svr5 ~]#  mail –s Error  root   < /etc/passwd

@重定向

#ls  anaconda-ks.cfg  ttt  > 1.log   2>  2.log    /分開存放

#vim  a.sh

#!/bin/bash

for  i   in  1  2   33  a    g                                       /看個數 循環五次

for  i   in  {1..100}    $(cat  a.txt)                         /循環

do

    useradd  $i    >>ok.log     2>>error.log                   /日誌追加寫入

    echo  「123」   |  passwd  --stdin   user$i        &>>2.log

done

#######

ls   >1.log    2>&1    =     ls   &>1      效果等同

#######

mail   -s    warning     root    <  mail.txt    再將文件發送到手機

監控【CPU】90%  》 郵件

####

top   -P  按cpu排序    -M  按內存排序

uptime

free 看內存  小於哪一個值用 if判斷

echo「CPU超了」   |  mail  -s   warning  abc@139.com

#######

@管道操做    

linux設計思想

small 【優勢:快,漏洞少bug】  【缺點:功能少,依賴關係】

用管道可使出錯率減少

who   | wc -l    看有多少人鏈接電腦

[root@svr5 ~]# yum list | grep cluster

####################################################

3、腳本的編寫

1.新建文件(.sh)

2.編寫內容(#!/bin/bash;#版本號、描述信息;)

3.賦予權限,執行(chmod  +x  )

執行腳本:有權限的# ./test.sh  相對路徑、#/root/test.sh  絕對路徑;

               無權限的:  1.開子進程的--#bash  test.sh   #sh  test.sh   ksh/tcsh/sh    #python  test.py     

                              2.不開子進程的--#source  test.sh  # .  test.sh  (修改系統腳本時,至關於reboot重起可當即生效)

printf  「abc」   python沒法解釋

which perl/python

#!/bin/bash

o=」chen」                             

exit                                  

[root@server0 ~]# bash 3.sh

[root@server0 ~]# echo  $o         //開子進程的方式bash/sh執行此腳本沒有任何變化

[root@server0 ~]# source  3.sh

[root@server0 ~]# echo  $o              //不子進程的方式source 執行此腳本會退出遠程

chen

#######

[root@server0 ~]# history | wc -l

58

[root@server0 ~]# .  /etc/profile     或     [root@server0 ~]# source /etc/profile

[root@server0 ~]# history | wc -l

10

###############################################################################

4、案例1:配置yum軟件源

[root@server0 ~]# vim test.sh

#!/bin/bash

echo -e "\033[31m     準備配置yum..       \033[0m"                 /紅色

sleep 1

rm  -rf  /etc/yum.repos.d/*

echo " [dvd]      

name=dvd     

baseurl=http://content.example.com/rhel7.0/x86_64/dvd                    

gpgcheck=0        

enabled=1"  > /etc/yum.repos.d/dvd.repo

yum clean all     &>/dev/null

echo  「yum源配置完

echo -e "\033[35m   可用的軟件有:   \033[0m"               /紫色

yum repolist     |   grep 「repolist」

######

案例2:編寫腳本,安裝軟件,自動啓動,開機自起

yum   -y   install   vsftpd       systemctl   restart    vsftpd       systemctl   enable   vsftpd      

yum -y install vsftpd   &>/dev/null

systemctl  restart  vsftpd

systemctl  enable  vsftpd   &>/dev/null

echo -e "\033[33m    vsftpd服務啓動完成,請訪問ftp//172.25.0.11 驗證     \033[0m"

firefox  ftp://172.25.0.11

####################################################

5、變量

自定義變量   1.定義:變量名=變量值  (中間不能有空格、特殊符號、數字開頭)

                        2.調用echo $變量名  #a=12  #b=13    #echo  $a$b    #echo  ${a}b

取消自定義變量: unset   變量名    腳本執行完變量會自動失效   # unset  a

系統變量

echo $0   當前所在的進程或腳本名

echo $1   1個參數; echo $2  2個參數;echo $3  3個參數

echo $*   全部位置變量的值

echo $#    已加載的位置變量的個數

echo  $$   當前運行進程的PID號  #ps aux | grep  PID

echo  $?  命令執行後的返回狀態,0表示正常,1或其餘值表示異常

######

[root@server0 ~]# vim   /bin/myuser

#!/bin/bash

useradd  $1

echo "$2"  |  passwd  --stdin  $1

[root@server0 ~]# chmod +x /bin/myuser

[root@server0 ~]# myuser   lili  123       /myuser變成一個命令   

[root@server0 ~]#/bin/myuser    lili  123

##########

ping  -c   2   192.168.4.254

##########################################################################

6、引號

雙引號「  」:引用總體  「a   b」  !=  a    b;   「ab」  ==  ab

單引號'  ':引用總體,屏蔽特殊符號命令等   a=11   「$a」 != '$a'

反引號` `:等於$()  ,引用命令,將該命令的執行結果做爲參數

                      例:每週五使用tar備份一個/var/log

vim   /root/test.sh

     time=`+%Y%m%d%H%M%S`

     tar   -czPf    /root/log.$time.tar.gz       /var/log  &>/dev/null

     01   03   *    *   5     /root/test.sh   &>/dev/null

案例補充:

1  #service  vsftpd  status

    [root@server0 ~]# chen="chen gui zhen"

2  [root@server0 ~]# set | grep chen

chen='chen gui zhen'

3  當前用戶的環境變量USER-用戶名、LOGNAME-登陸名、HOME-宿主目錄、SHELL-登陸Shell、HOSTNAME-主機名、TERM-終端類型:

[root@server0 ~]# echo $USER  $LOGNAME $HOME $SHELL  $HOSTNAME $TERM  $UID  $PATH   ..

root    root    /root    /bin/bash    server0.example.com     xterm-256color

 

4   環境變量PS1表示Shell環境的一級提示符,即命令行提示符(\u 用戶名、\h 主機名、\W 工做目錄、\$ 權限標識):[\u@\h \W]\$

環境變量PS2表示二級提示符,出如今強制換行、at任務編輯等場合:# echo $PS2

使用env可查看全部環境變量:# env

使用set可查看全部變量(包括env能看到的環境變量):# set

 

全局變量:操做系統的變量   

$PATH:命令搜索路徑(目錄),爲ls、cat、find等提供路徑搜索 ,對全部操做系統都很重要

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

源碼裝的軟件都不會放在PATH路徑下,須要本身作個連接,或加到PATH路徑下PATH=$PATH:/root/

export  i=5  或   x=8;export  x

局部變量:本身寫的變量

i=5  腳本執行完就失效

 

 

 

Top 

NSD SHELL DAY01

案例1Shell基礎應用 

案例2:簡單Shell腳本的設計 

案例3:使用Shell變量 

案例4:變量的擴展應用 

1 案例1:Shell基礎應用

1.1 問題

本案例要求熟悉Linux Shell環境的特色,主要練習如下操做:

切換用戶的Shell環境

練習命令歷史、命令別名

重定向標準輸入/輸出/錯誤輸出

管道操做實踐

1.2 步驟

實現此案例須要按照以下步驟進行。

步驟一:切換用戶的Shell環境

若須要臨時使用另外一種Shell環境,能夠直接執行對應的Shell解釋器程序,好比只要執行zsh能夠切換到zsh命令行環境。

[root@svr5 ~]# yum -y install zsh              //若缺乏zsh請先安裝zsh

.. ..

[root@svr5 ~]# cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/bin/tcsh

/bin/csh

/bin/ksh

/bin/zsh                                      //確認當前系統已識別zsh

 

[root@svr5 ~]# zsh                              //進入zsh環境

[root@svr5]~# help help                          //嘗試查看內部命令help的用法

zsh: command not found: help                      //失敗,由於zsh未提供內部命令help

[root@svr5]~# exit                              //返回到切換前的bash環境

若但願修改用戶的登陸Shell,管理員能夠直接經過usermod命令設置。好比,如下操做可將用戶zhangsan的登陸Shell改成/bin/tcsh:

[root@svr5 ~]# grep 'zhangsan' /etc/passwd

zhangsan:x:516:516::/home/zhangsan:/bin/bash              //修改前

[root@svr5 ~]# usermod -s /bin/tcsh zhangsan              //執行修改操做

[root@svr5 ~]# grep 'zhangsan' /etc/passwd

zhangsan:x:516:516::/home/zhangsan:/bin/tcsh              //修改後

若是須要臨時修改登陸Shell能夠直接在命令行中,輸入新的Shell命令便可,如直接經過輸入ksh切換:

[root@ svr5 ~]# yum –y install ksh                        //安裝新的ksh

[root@ svr5 ~]# ksh                                    //切換Shell

#                                                    //進入新的Shell

步驟二:練習命令歷史

1)檢查歷史命令的容量。

默認記錄1000條,經過全局變量HISTSIZE設置,對全部用戶有效:

[root@svr5 ~]# grep HISTSIZE /etc/profile

HISTSIZE=1000

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC

查看已爲當前用戶記錄的歷史命令條數:

[root@svr5 ~]# history | wc -l

1000

2)查看歷史命令列表。

列出最近執行的10條歷史命令:

[root@svr5 ~]# history | tail

 1028  grep 'zhangsan' /etc/passwd

 1029  cat /etc/redhat-release

 1030  usermod -s /bin/tcsh zhangsan

 1031  grep 'zhangsan' /etc/passwd

 1032  su - zhangsan

 1033  echo 1234567 | passwd --stdin zhangsan

 1034  su - zhangsan

 1035  grep HISTSIZE /etc/profile

 1036  history | wc -l

 1037  history | tail

3)調用指定的歷史命令。

從新執行歷史命令列表中的第1028條操做:

[root@svr5 ~]# !1028

grep 'zhangsan' /etc/passwd

zhangsan:x:516:516::/home/zhangsan:/bin/bash

從新執行最近一次以cat開頭(根據實際狀況變動)的歷史命令操做:

[root@svr5 ~]# !cat

cat /etc/redhat-release

Red Hat Enterprise Linux Server release 5.9 (Tikanga)

4)清空已記錄的歷史命令。

[root@svr5 ~]# history -c                      //清空本身的歷史命令

[root@svr5 ~]# > ~/.bash_history              //清空記錄文件

[root@svr5 ~]# history                          //再次檢查歷史命令列表

   42  > ~/.bash_history

   43  history

步驟三:練習命令別名

1)查看已經定義的命令別名列表。

當前的別名列表:

[root@svr5 ~]# alias

alias cp='cp -i'

alias l.='ls -d .* --color=tty'

alias ll='ls -l --color=tty'

alias ls='ls --color=tty'

alias mv='mv -i'

alias rm='rm -i'

alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

別名設置通常存放在用戶的.bashrc文件內:

[root@svr5 ~]# grep '^alias' ~/.bashrc

alias rm='rm -i'

alias cp='cp -i'

alias mv='mv -i'

2)自定義新的命令別名

添加一個名爲lh的命令別名,實際執行的是「ls –lh –color=tty」:

[root@svr5 ~]# alias lh='ls -lh'                      //定義別名命令lh

[root@svr5 ~]# alias lh                              //確認定義結果

alias lh='ls -lh'

驗證別名命令的效果:

[root@svr5 ~]# lh /etc/fstab                          //使用別名

-rw-r--r-- 1 root root 733 10-09 15:34 /etc/fstab

[root@svr5 ~]# ls -lh /etc/fstab                      //使用完整的命令

-rw-r--r-- 1 root root 733 10-09 15:34 /etc/fstab

3)取消別名

取消單個別名:

[root@svr5 ~]# unalias lh                          //取消名爲lh的命令別名

[root@svr5 ~]# alias lh                          //查詢時已沒有lh

-bash: alias: lh: not found

取消全部別名:

[root@svr5 ~]# unalias -a                          //取消全部別名

[root@svr5 ~]# alias                              //查詢時已無任何別名

[root@svr5 ~]#

步驟四:重定向標準輸入/輸出/錯誤輸出

標準輸入(stdin),描述號爲0;標準輸出(stdout),描述號爲1;標準錯誤(stderr),描述號爲2。

1)重定向標準輸出。

使用 > 將命令執行的正常輸出重定向到文件:

[root@svr5 ~]# ls -l /dev/pts/0                  //正常應輸出到屏幕

crw--w---- 1 root tty 136, 0 12-10 14:04 /dev/pts/0

[root@svr5 ~]# ls -l /dev/pts/0 > stdout.txt      //重定向到文件

[root@svr5 ~]# cat stdout.txt                      //確認重定向輸出的結果

crw--w---- 1 root tty 136, 0 12-10 14:04 /dev/pts/0

> 操做會覆蓋目標文件(先清空、再寫入):

[root@svr5 ~]# echo "I am the king." > stdout.txt          //覆蓋目標文件

[root@svr5 ~]# cat stdout.txt                          //確認結果

I am the king.

改用 >> 可實現追加劇定向輸出:

[root@svr5 ~]# ls -l /dev/pts/0 >> stdout.txt              //追加輸出

[root@svr5 ~]# cat stdout.txt

I am the king.                                          //原有內容還保留

crw--w---- 1 root tty 136, 0 12-10 14:08 /dev/pts/0      //新加的內容

2)重定向標準錯誤。

對於命令執行出錯的信息,使用 > 沒法保存,仍然會輸出到屏幕。好比,可以使用ls命令同時查看兩個對象(其中nofile並不存在),重定向輸出:

[root@svr5 ~]# ls -lh nofile.txt /etc/fstab > stderr.txt

ls: nofile.txt: 沒有那個文件或目錄              //出錯信息仍顯示到屏幕

[root@svr5 ~]# cat stderr.txt                  //正常信息成功重定向到目標文件

-rw-r--r-- 1 root root 733 10-09 15:34 /etc/fstab

使用 2> 可重定向錯誤信息,好比,可執行一個錯誤的命令:

[root@svr5 ~]# ipconfig /all

-bash: ipconfig: command not found          //正常狀況下,錯誤顯示到屏幕

[root@svr5 ~]# ipconfig /all 2> stderr.txt  //將錯誤信息重定向到目標文件

[root@svr5 ~]# cat stderr.txt                  //確認重定向結果

-bash: ipconfig: command not found

相似的,2>> 可實現追加輸出:

[root@svr5 ~]# ls nofile 2>> stderr.txt

[root@svr5 ~]# cat stderr.txt

-bash: ipconfig: command not found

ls: nofile: 沒有那個文件或目錄

若但願將正常輸出、錯誤輸出重定向同一個文件,可以使用 &> :

[root@svr5 ~]# ls -lh nofile.txt /etc/fstab &> stderr.txt

[root@svr5 ~]# cat stderr.txt

ls: nofile.txt: 沒有那個文件或目錄

-rw-r--r-- 1 root root 733 10-09 15:34 /etc/fstab

3)重定向標準輸入。

[root@svr5 ~]# mail –s Error  root   < /etc/passwd

步驟五:管道操做實踐

藉助於管道符「|」,能夠將一條命令的標準輸出交給另外一條命令處理,在一條命令行內可依次使用多個管道。

1)統計/etc/目錄下資料的數量。

[root@svr5 ~]# ls -l /etc | wc -l

254

2)列出Yum庫里名稱中含cluster的軟件包。

[root@svr5 ~]# yum list | grep cluster

cluster-cim.x86_64                 0.12.1-7.el5     RHEL5-Cluster

cluster-snmp.x86_64                 0.12.1-7.el5     RHEL5-Cluster

… …

2 案例2:簡單Shell腳本的設計

2.1 問題

本案例要求編寫三個腳本程序,分別實現如下目標:

在屏幕上輸出一段文字「Hello World」

可以爲本機快速配好Yum倉庫

可以爲本機快速裝配好vsftpd服務

2.2 方案

一個規範的Shell腳本構成包括:

腳本聲明(須要的解釋器、做者信息等)

註釋信息(步驟、思路、用途、變量含義等)

可執行語句(操做代碼)

2.3 步驟

實現此案例須要按照以下步驟進行。

步驟一:編寫第一個Shell腳本,輸出「Hello World」

1)根據手動任務操做編寫腳本文件

[root@svr5 ~]# vim  /root/first.sh  

#!/bin/bash

echo  'Hello World'

 

[root@svr5 ~]# chmod  +x  /root/first.sh                      //添加可執行權限

2)執行腳本,測試效果

[root@svr5 ~]# /root/first.sh

Hello World

3)Shell腳本的執行方式:

方法一,做爲「命令字」:指定腳本文件的路徑,前提是有 x 權限

[root@svr5 ~]# ./first.sh                            //指定相對路徑

[root@svr5 ~]# /root/first.sh                        //指定絕對路徑

方法二,做爲「參數」:使用bash、sh、source或者點號 . 來加載腳本文件

[root@svr5 ~]# bash   first.sh                        //開啓子進程

[root@svr5 ~]# sh        first.sh                        //開啓子進程

[root@svr5 ~]# source first.sh                        //不開啓子進程

[root@svr5 ~]# .        first.sh                        //不開啓子進程

步驟二:編寫爲本機快速配Yum倉庫的Shell腳本

1)Yum倉庫配置文件的參考內容以下:

[root@svr5 ~]# vim /etc/yum.repos.d/rhel6.repo

[rhel6]

name=Red Hat Enterprise Linux 6

baseurl=file:///misc/cd

enabled=1

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

2)根據參考文件的內容,編寫腳本內容以下:

[root@svr5 ~]# vim  /root/el6repo.sh

#!/bin/bash

rm  -rf  /etc/yum.repos.d/*.repo

echo  '[rhel-packages]

name=Red Hat Enterprise Linux 6

baseurl=file:///misc/cd

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

'  > /etc/yum.repos.d/rhel6.repo

[root@svr5 ~]# chmod +x /root/el6repo.sh                      //添加可執行權限

3)執行腳本,測試效果

執行配置Yum倉庫的腳本:

[root@svr5 ~]# /root/el6repo.sh

檢查配置結果:

[root@svr5 ~]# ls /etc/yum.repos.d/*                          //倉庫配置已創建

/etc/yum.repos.d/rhel6.repo

 

[root@svr5 ~]# yum repolist                                  //Yum倉庫已可用

rhel-packages                              | 3.9 kB     00:00 ...

rhel-packages/primary_db                  | 3.1 MB     00:00 ...

repo id                repo name                       status

rhel-packages         Red Hat Enterprise Linux 6     3,690

repolist: 3,690

步驟三:編寫快速裝配vsftpd服務的Shell腳本

1)編寫參考腳本文件以下:

[root@svr5 ~]# vim  /root/ftpon.sh

#!/bin/bash

yum  -y  install  vsftpd  &> /dev/null

service  vsftpd  restart

chkconfig  vsftpd  on

[root@svr5 ~]# chmod  +x  /root/ftpon.sh                  //添加可執行權限

3)執行腳本,測試效果

執行快速裝配vsftpd服務的腳本:

[root@svr5 ~]# /root/ftpon.sh

關閉 vsftpd:                                              [失敗]

vsftpd 啓動 vsftpd:                                    [肯定]

確認腳本執行結果:

[root@svr5 ~]# rpm -q vsftpd

vsftpd-2.2.2-11.el6_4.1.x86_64

 

[root@svr5 ~]# service vsftpd status

vsftpd (pid 45694) 正在運行...

 

[root@svr5 ~]# chkconfig --list vsftpd

vsftpd          0:關閉  1:關閉  2:啓用  3:啓用  4:啓用  5:啓用  6:關閉

3 案例3:使用Shell變量

3.1 問題

本案例要求熟悉Shell變量的使用,主要練習或驗證下列內容:

定義/賦值/查看變量

環境/預約義/位置變量的應用

除了學會創建和引用變量之外,還要認識環境變量PWD、USER、HOME、SHELL,還有預約義變量$0、$$、$?、$#、$*,以及位置變量$一、$二、$十、……的做用。

3.2 步驟

實現此案例須要按照以下步驟進行。

步驟一:變量的定義/賦值/查看

1)新建/賦值變量

新建變量SCHOOL,賦值「Tarena IT GROUP」,經過set命令能夠檢查變量設置:

[root@svr5 ~]# SCHOOL="Tarena IT"

[root@svr5 ~]# set | grep SCHOOL

SCHOOL='Tarena IT'

2)查看變量

經過echo $變量名 可輸出變量值:

[root@svr5 ~]# echo $SCHOOL

Tarena IT

查看變量時,若變量名稱與後面要輸出的字符串連在一塊兒,則應該以{}將變量名括起來以便區分:

[root@svr5 ~]# echo $SCHOOLGroup              //沒法識別變量名SCHOOL

 

[root@svr5 ~]# echo ${SCHOOL}Group          //區分後能夠識別

Tarena ITGroup

3)撤銷自定義變量

若要撤銷已有的變量,可以使用unset命令:

[root@svr5 ~]# unset SCHOOL                  //撤銷變量SCHOOL

[root@svr5 ~]# echo $SCHOOL                  //查看時已無結果

步驟二:使用環境變量

1)查看環境變量相關文件

全局文件爲/etc/profile,對全部用戶有效;用戶文件爲~/.bash_profile,僅對指定的用戶有效。

查看/etc/profile文件內容:

[root@svr5 ~]# cat /etc/profile

.. ..

if [ -x /usr/bin/id ]; then

        USER="`id -un`"

        LOGNAME=$USER

        MAIL="/var/spool/mail/$USER"

fi

HOSTNAME=`/bin/hostname`

HISTSIZE=1000

.. ..

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC

.. ..

2)使用環境變量

當前用戶的環境變量USER記錄了用戶名、LOGNAME記錄了登陸名、HOME記錄了宿主目錄、SHELL記錄了登陸Shell、HOSTNAME記錄主機名、TERM記錄終端類型:

[root@svr5 ~]# echo $USER $LOGNAME $HOME $SHELL

root root /root /bin/bash

[root@svr5 ~]# echo $HOSTNAME

svr5.tarena.com

[root@svr5 ~]# echo $TERM

xterm

環境變量PS1表示Shell環境的一級提示符,即命令行提示符(\u 用戶名、\h 主機名、\W 工做目錄、\$ 權限標識):

[root@svr5 src]# echo $PS1                  //查看默認的一級提示

[\u@\h \W]\$

[root@svr5 src]#PS1='bash-3.2\$'          //修改一級提示

bash-3.2#                                  //更改結果

bash-3.2#PS1='[\u@\h \W]\$ '              //恢復原有設置

[root@svr5 src]#

環境變量PS2表示二級提示符,出如今強制換行、at任務編輯等場合:

[root@svr5 ~]# echo $PS2                  //查看默認的二級提示

>

[root@svr5 src]# cd \                     //強制換行,觀察提示符效果

> /root/

[root@svr5 ~]# PS2='=> '                  //手動修改二級提示

[root@svr5 ~]# cd \                      //再次驗證提示符效果

=> ~

[root@svr5 ~]# PS2='> '                     //恢復原有設置

3)查看系統變量

使用env可查看全部環境變量:

[root@svr5 src]# env

HOSTNAME=svr5.tarena.com

TERM=xterm

SHELL=/bin/bash

HISTSIZE=1000

SSH_CLIENT=192.168.4.110 59026 22

OLDPWD=/root

SSH_TTY=/dev/pts/0

USER=root

.. ..

使用set可查看全部變量(包括env能看到的環境變量):

[root@svr5 src]# set

BASH=/bin/bash

BASH_ARGC=()

BASH_ARGV=()

BASH_LINENO=()

.. ..

步驟三:使用位置變量與預約義變量

1)建立一個測試腳本,用來展現。

[root@svr5 ~]# vim location.sh

#!/bin/bash

echo $0                                //腳本的名稱

echo $1                                //第一個參數

echo $2                                //第二個參數

echo $*                                //全部參數

echo $#                                //全部的綜合

echo $$                                //當前進程的進程號

echo $?                                //上一個程序的返回狀態碼

[root@svr5 ~]# chmod +x location.sh              //添加可執行權限

2)執行腳本location.sh,測試結果。

[root@svr5 ~]# ./location.sh one 1 2 abc qq 8 7

步驟四:建立帳戶與修改密碼的腳本

1)編寫腳本。

[root@svr5 ~]# vim /root/user.sh

#!/bin/bash

useradd $1

echo "$2" |passwd --stdin $1

執行腳本測試:

[root@svr5 ~]# ./user.sh jerry  123456

更改用戶 jerry 的密碼 。

passwd: 全部的身份驗證令牌已經成功更新。

4 案例4:變量的擴展應用

4.1 問題

本案例要求進一步熟悉Shell變量的賦值控制,主要練習或驗證下列內容:

三種引號對賦值的影響

使用read命令從鍵盤讀取變量值

使用export發佈全局變量

4.2 步驟

實現此案例須要按照以下步驟進行。

步驟一:三種引號對變量賦值的影響

1)雙引號的應用

使用雙引號能夠界定一個完整字符串。

[root@svr5 ~]# SCHOOL=Tarena IT Group

-bash: IT: command not found                      //未界定時賦值失敗

[root@svr5 ~]# SCHOOL="Tarena IT Group"          //界定後成功

[root@svr5 ~]# touch aa bb                      //建立了兩個文件

[root@svr5 ~]# touch "aa bb"                    //建立了一個文件

[root@svr5 ~]# ll                                //查看結果

2)單引號的應用

界定一個完整的字符串,而且能夠實現屏蔽特殊符號的功能。

[root@svr5 ~]# NOTE='當前的用戶是:$USER'

[root@svr5 ~]# echo $NOTE

當前的用戶是:$USER                              //單引號內的 $ 被視爲普通字符

3)反撇號或$()的應用

使用反撇號或$()時,能夠將命令執行的標準輸出做爲字符串存儲,所以稱爲命令替換。

[root@svr5 ~]# tar -czf log-`date +%Y%m%d`.tar.gz /var/log

步驟二:使用read命令從鍵盤讀取變量值

1)read基本用法

執行後從會等待並接受用戶輸入(無任何提示的狀況),並賦值給變量str:

[root@svr5 ~]# read str

What's happen ?                          //隨便輸入一些文字,按Enter鍵提交

[root@svr5 ~]# echo $str                  //查看賦值結果

What's happen ?

爲了避免至於使用戶不知所措、莫名其妙,推薦的作法是結合-p選項給出友好提示:

[root@svr5 ~]# read -p "請輸入一個整數:" i

請輸入一個整數:240

[root@svr5 ~]# echo $i

240

2)stty終端顯示控制

將回顯功能關閉(stty -echo),

將回顯功能恢復(stty echo)。

可參考下列操做建立一個測試腳本:

[root@svr5 ~]# vim sttyecho.sh              //建立一個測試腳本

#!/bin/bash

read -p "localhost login: " USERNAME          //讀取用戶名

stty -echo                                  //關閉回顯

  read -p "Password: " PASSWORD              //讀取密碼

stty echo                                  //恢復回顯

echo ""                                      //恢復回顯後補一個空行

echo "Your login name is: $USERNAME"          //確認賦值結果

echo "Your password is: $PASSWORD"          //確認賦值結果

[root@svr5 ~]# chmod +x sttyecho.sh          //添加執行權限

執行測試腳本sttyecho.sh,驗證效果:

[root@svr5 ~]# ./sttyecho.sh

localhost login: root                      //輸入root,回車

Password:                                  //輸入1234567(不會顯示),回車

Your login name is: root                  //腳本反饋結果

Your password is: 1234567

步驟三:使用export發佈全局變量

默認狀況下,自定義的變量爲局部變量,只在當前Shell環境中有效,而在子Shell環境中沒法直接使用。好比已定義的SCHOOL變量,當進入到sh或bash子Shell後,變量SCHOOL將處於未定義的狀態:

[root@svr5 ~]# echo $SCHOOL

Tarena IT Group

[root@svr5 ~]# sh                          //開啓一個sh子進程

sh-3.2# echo $SCHOOL                          //查看SCHOOL變量值無結果

 

sh-3.2# exit                              //返回原有Shell環境

exit

[root@svr5 ~]# bash                          //開啓bash子進程

[root@svr5 ~]# echo $SCHOOL                  //查看SCHOOL變量值無結果

 

[root@svr5 ~]# exit                          //返回原有Shell環境

exit

[root@svr5 ~]#

若但願定義的變量能被子進程使用,可使用export命令將其發佈爲全局變量。使用export發佈時,只需指定變量名(能夠有多個)便可,也能夠經過export命令直接設置新的全局變量:

[root@svr5 ~]# export SCHOOL                      //發佈已定義的變量

[root@svr5 ~]# export XX="1234"                  //發佈新變量

[root@svr5 ~]# NSD="Network&System Direction"

[root@svr5 ~]# export NSD YY="5678"              //混合式發佈

驗證剛剛發佈的全局變量:

[root@svr5 ~]# sh                              //進入shShell環境

sh-3.2# echo $SCHOOL                          //查看全局變量的值 .. ..

Tarena IT Group

sh-3.2# echo $NSD

Network&System Direction

sh-3.2# echo $XX $YY

1234 5678

sh-3.2# exit                                  //返回原有Shell環境

exit

[root@svr5 ~]#

若要取消全局變量的全局屬性,可結合export命令的 -n 選項;若要取消變量,則應使用unset命令。好比,如下操做可將前面發佈的SCHOOL、XX恢復成局部變量:

[root@svr5 ~]# export -n SCHOOL XX          //取消全局變量屬性

[root@svr5 ~]# echo $SCHOOL $XX              //局部變量SCHOOLXX仍可用

Tarena IT Group 1234

[root@svr5 ~]# sh

sh-3.2# echo $SCHOOL $XX                      //全局變量SCHOOLXX已不可用

 

sh-3.2# exit                                  //返回原有Shell環境

exit

[root@svr5 ~]#

相關文章
相關標籤/搜索