Shell概述 編寫及執行腳本 、 Shell變量

SHEEL DAY1

[root@room4pc09 桌面]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

清空已記錄的歷史命令。
[root@svr5 ~]# history -c //清空自己的歷史命令
[root@svr5 ~]# > ~/.bash_history //清空記錄文件
[root@svr5 ~]# history //再次檢查歷史命令列表
42 > ~/.bash_history
43 history

清屏幕:或clear

bash執行腳本中的文件

一定要清楚自己寫的腳本是交互還是非交互的!!
交互 需要自己確認

Ctrl+A 跳到命令行開頭
Ctrl+E 跳到命令行結尾

Ctrl+z 不能在Linux中用

!+(最近用過的文件的關鍵詞或history中的編號)
eg: !vim
!cat

history -c(clear) 清空歷史 默認1000條
vim /etc/profile
HISTSIZE=(50-100條就夠用了)

別名(要有意義一些,否則不好識別)
直接在命令行輸入alias 你好=‘ls’
命令+選項 ===alias

輸出 重定向
正確1 默認屏幕
錯誤2 默認屏幕
ls > a.log 有正確的東西,a.log裏面纔會有內容

ls &>

firefox &

for(循環) i in {.....}

/dev/null 垃圾站

是覆蓋 >>追加

scp

clone-vm7 (可安裝1-10個虛擬機)
init5 字符界面變成圖形界面

寫腳本步驟:
bash test.sh
1.新建文件,擴展名最好是sh
2.寫內容
一行必須是#!/bin/bash
下面的所有 指令都在/bin/bash下——定解釋器
#都不會被執行,是註釋信息
3.執行腳本
1)有權限的 rwx

eg : ./test.sh ./只顯示當前目錄下的文檔
chomod +x test.sh 添加執行權限

PATH=路徑 ls在PATH裏面找路徑
ln -s /root/test.sh /bin/abc
--symbolic符號 make symbolic links instead of hard linksq

2)無權限的
bash 文件名 會開啓子進程(子進程執行) 執行完,自動退出
source 文件名 不會開啓子進程 (當前執行)
eg:同時開啓兩個窗口
寫腳本,sleep 100
(1)bash test.sh 或 source test.sh
另一個窗口執行:pstree
(2)bash text.sh 腳本寫exit
sshd--bash--bash--exit
source test.sh
sshd--bash--exit
echo $a

)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                        //不開啓子進程

ps與pstree(進程樹)
查詢文件在哪 eg:which+bash

ftp://192.168.4.254

練習(在虛擬機上配置)

自己搭建yum源,file,ftp,http
mount -o loop 光盤.iso /var/ftp/pub

1)#!/bin/bash
rm -rf /etc/yum.repo.d/*
echo "[abc]
name=added from: http://192. 168.4.254/rh7dvd
baseurl=http://192.168.4.254/rh7dvd
enabled=1
gpgcheck=0" > /etc/yum.repo.d/abc.repo
yum clean all
yum repolist

2)#!/bin/bash
rm -rf /etc/etc/yum.repo.d/*
yum-config-manager ....
echo "gpgcheck=0" >> 文件
yum clean all
yum repolist

ftp /var/ftp/
http /var/www/html/

無vim時 可用vi

win.iso > 4G 刪除後不會存放在Trash中,太大

自動配置yum源
yum -y install vsftpd
systemctl start vsftpd
systemctl enable vsftpd

1.自動完成
2.出錯0
3.防止步驟的丟失

變量名=變量值

注意:
1.等號兩邊不能有空格
2.變量名【字母,數字,下劃線_,不能包含特殊符號,不能以數字開頭】
3.如變量名已經存在,同名變量會被覆蓋

調用變量 $名稱
a=1
echo ${a}RMB 相當於(1+2)*2 有歧義就加個{}
1RMB

寫腳本--測試---完成
備份

SHEEL 弱類型的腳本語言

env 列出所有的環境變量
set 包含所有的變量 使用set可查看所有變量(包括env能看到的環境變量)

系統自帶的都是大寫的

PS1 定義的是命令提示符
PS2 二級提示符

vim test.sh
echo $0 文件名字
echo $1 第一個參數
echo $2 第二個參數
echo $3 第三個參數
echo $* 所有的參數
echo $# 已加載位置變量個數
echo $? 上一個程序的是否成功

useradd tom
echo "12345" | passwd --stdin tom

寫一個腳本,根據用戶需求,來自動創建用戶密碼
#!/bin/bash
useradd $1
echo "$2" | passwd --stdin $1

寫腳本,根據用戶需求創建n個用戶,初始密碼都是123456
./text.sh tom janny lily

for i in $*
useradd

$0 $1 $2 $* $# 系統默認
echo $? 上一個命令是否成功 (0表示成功,1或其他值表示失敗)

for循環語句

源碼安裝
tar xf
echo $?
./configure
make
make install

$$ 當前進程的進程號

echo $$ > /var/run/test.pid
sleep 1000

重點

重定向
管道

變量(自定義,系統)
keyname=value

1.系統自帶 HOME PATH USER PWD UID
$0 $1 $2 $3 .... $* $# $?

2.自定義 a=1
思維過程
ps aux | grep test.sh

rpm -q(-query 詢問) vsftpd

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='> '                     //恢復原有設置

  \d :代表日期,格式爲weekday month date,例如:"Mon Aug 1"
  \H :完整的主機名稱。例如:我的機器名稱爲:fc4.linux,則這個名稱就是fc4.linux
  \h :僅取主機的第一個名字,如上例,則爲fc4,.linux則被省略
  \t :顯示時間爲24小時格式,如:HH:MM:SS
  \T :顯示時間爲12小時格式
  \A :顯示時間爲24小時格式:HH:MM
  \u :當前用戶的賬號名稱
  \v :BASH的版本信息
  \w :完整的工作目錄名稱。家目錄會以 ~代替
  \W :利用basename取得工作目錄名稱,所以只會列出最後一個目錄
  # :下達的第幾個命令
  \$ :提示字符,如果是root時,提示符爲:# ,普通用戶則爲:$

中英文轉換
#LANG=zh_CN.UTF-8

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                              //進入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 ~]#

真機yum(loop循環)

40 mkdir -p /var/www/rh7dvd
41 mount -o loop /ISO/rhel-server-7.2-x86_64-dvd.iso /var/www/rh7dvd
42 yum-config-manager --add-repo http://192.168.4.254/rh7dvd
43 vim /etc/yum.repos.d/192.168.4.254_rh7dvd.repo
44 yum clean all
45 yum repolist
46 cd
47 cd /etc/yum.repos.d/
48 ls
49 rm -rf ISO_rhel-server-7.2-x86_64-dvd.iso.repo
50 mkdir -p /var/www/html/rh7dvd
51 umount /var/www/rh7dvd/
52 mount -o loop /ISO/rhel-server-7.2-x86_64-dvd.iso /var/www/html/rh7dvd/
53 yum clean all
54 yum repolist

虛擬機yum
yum-config-manager --add-repo http://192.168.4.254/rh7dvd
vim /etc/yum.repo.d/192.168.4.254_rh7dvd.repo
yum clean all
yum repolist

掛在光盤
mkdir /mnt //創建掛在點
mount /dev/cdrom /mnt //掛載設備
yum-config-manager --add-repo file:///mnt/
vim /etc/yum.repo.d/*
yum clean all
yum repolist

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章