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 去掉別名 ; i:interacter交互式;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 腳本執行完就失效
本案例要求熟悉Linux Shell環境的特色,主要練習如下操做:
切換用戶的Shell環境
練習命令歷史、命令別名
重定向標準輸入/輸出/錯誤輸出
管道操做實踐
實現此案例須要按照以下步驟進行。
步驟一:切換用戶的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
… …
本案例要求編寫三個腳本程序,分別實現如下目標:
在屏幕上輸出一段文字「Hello World」
可以爲本機快速配好Yum倉庫
可以爲本機快速裝配好vsftpd服務
一個規範的Shell腳本構成包括:
腳本聲明(須要的解釋器、做者信息等)
註釋信息(步驟、思路、用途、變量含義等)
可執行語句(操做代碼)
實現此案例須要按照以下步驟進行。
步驟一:編寫第一個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:關閉
本案例要求熟悉Shell變量的使用,主要練習或驗證下列內容:
定義/賦值/查看變量
環境/預約義/位置變量的應用
除了學會創建和引用變量之外,還要認識環境變量PWD、USER、HOME、SHELL,還有預約義變量$0、$$、$?、$#、$*,以及位置變量$一、$二、$十、……的做用。
實現此案例須要按照以下步驟進行。
步驟一:變量的定義/賦值/查看
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: 全部的身份驗證令牌已經成功更新。
本案例要求進一步熟悉Shell變量的賦值控制,主要練習或驗證下列內容:
三種引號對賦值的影響
使用read命令從鍵盤讀取變量值
使用export發佈全局變量
實現此案例須要按照以下步驟進行。
步驟一:三種引號對變量賦值的影響
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 //進入sh子Shell環境
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 //局部變量SCHOOL、XX仍可用
Tarena IT Group 1234
[root@svr5 ~]# sh
sh-3.2# echo $SCHOOL $XX //全局變量SCHOOL、XX已不可用
sh-3.2# exit //返回原有Shell環境
exit
[root@svr5 ~]#