Shell02---變量


Shell02---變量

1. shell變量概述

1. 什么是變量
變量是Shell傳遞數據的一種方法,簡單理解:用一個固定的字符串去表示不固定的內容,便於后續引用。
2.變量命令規范

變量定義時名稱有要求:字母、數字、下划線幾個組成,盡量字母開頭,變量名最好具備一定的含義。

ip=10.0.0.100  
ip1=10.0.0.100  
Hostname_Ip=10.0.0.100  
hostname_IP=10.0.0.100  
等號是賦值,需要注意:等號兩邊不能有空格,其次定義的變量不要與系統命令出現沖突。

3. Shell變量定義的方式

01)用戶自定義變量:人為定義的變量名稱。

02)系統環境變量:保存的是和系統操作環境相關的數據。

03)位置參數變量:向腳本中進行參數傳遞,變量名不能自定義,變量作用是固定的。

04)預定義的變量:是bash中已經定義好的變量,變量名不能自定義,變量作用也是固定的。

4. Shell變量定義實踐

01.用戶自定義變量示例,當前Shell有效

#1.定義變量,變量名=變量值。不能出現"-橫崗"命令
[root@gjy~]# gjy="hello shell"        #定義變量有空格時,必須使用引號
#2.引用變量,$變量名
或 ${變量名}
[root@gjy ~]# echo $gjy
hello shell
[root@gjy ~]# echo $gjy_test[root@gjy ~]# echo ${gjy}_test
hello shell_test
#3.查看變量,set顯示所有變量,包括自定義變量和環境變量
[root@gjy ~]# set |grep gjy
HOSTNAME=gjy
gjy='hello shell'
[root@gjy ~]# env|grep gjy       #只顯示系統的環境變量
HOSTNAME=gjy
#4.取消變量,作用范圍:僅在當前Shell中有效。
[root@gjy ~]# unset gjy
[root@gjy ~]# set |grep gjy
HOSTNAME=gjy
#5.注意事項,引用變量時注意事項,單雙引號和不加引號的區別。
[root@gjy ~]# var=$(hostname)
[root@gjy ~]# echo $var
gjy
[root@gjy ~]# var="$(hostname)"
[root@gjy ~]# echo $var
gjy
[root@gjy ~]# var='$(hostname)'
[root@gjy ~]# echo $var
$(hostname)
[root@gjy ~]# echo "$var"
$(hostname)
[root@gjy ~]# echo '$var'
$var
[root@gjy ~]# name=gjy
[root@gjy ~]# echo $name
gjy
[root@gjy ~]# echo $name money is $10000000000
gjy money is 0000000000
[root@gjy ~]# echo "$name money is $10000000000"
gjy money is 0000000000
[root@gjy ~]# echo '$name money is $10000000000'
$name money is $10000000000
[root@gjy ~]# echo $name money is \$10000000000
gjy money is $10000000000
[root@gjy ~]# echo "$name money is \$10000000000"
gjy money is $10000000000
[root@gjy ~]# echo '$name money is \$10000000000'
$name money is \$10000000000
[root@gjy ~]# echo $name money is '$10000000000'
gjy money is $10000000000

總結:

  1. 單引號 #所見即所得,吃啥吐啥,原封不動的輸出。
  2. 雙引號 #與單引號類似,特殊符號會被解析(運行):$ $() ``
  3. 不加引號 #與雙引號類似,如果出現空格,不會算作一個整體。
  4. 反引號 #先執行反引號里面的命令,把執行的結果顯示出來。

2.系統環境變量示例,在當前Shell和子Shell有效

#1.定義環境變量:export 變量,將自定義變量轉換成環境變量。
[root@gjy ~]# echo $name
gjy
[root@gjy ~]# cat test.sh
#!bin/bash
echo $name
[root@gjy ~]# sh test.sh                #執行腳本時,會調用另一個bash執行,就訪問不到$name的值。
[root@gjy ~]# export name=gjy        #將變量轉換為環境變量
[root@gjy ~]# sh test.sh                #再次執行腳本
gjy
#注意:
使用export可以在當前用戶的所有環境生效。
將export定義變量寫入/etc/bashrc,對所有用戶永久生效。
將exprot定義變量寫入.bashrc,只對該用戶永久生效。
#2.使用系統已定義好的環境變量
[root@gjy ~]# cat env.sh
#!/bin/bash
echo "用戶的家目錄: $HOME"
echo "當前主機名是: $HOSTNAME"
echo "當前所在目錄: $PWD"
echo "當前連接服務器使用的地址和端口是: $SSH_CONNECTION"[root@gjy ~]# sh env.sh
用戶的家目錄: /root
當前主機名是: gjy
當前所在目錄: /root
當前連接服務器使用的地址和端口是: 10.0.0.1 62881 10.0.0.98 22

03. 預先定義的變量參數示例,系統內置變量的使用方法。

#1.腳本如下:#!/bin/bash
echo "#當前shell腳本的文件名: $0"
echo "#第1個shell腳本位置參數:$1"
echo "#第2個shell腳本位置參數:$2"
echo "#第3個shell腳本位置參數:$3"
echo "#所有傳遞的位置參數是: $*"
echo "#所有傳遞的位置參數是: $@"
echo "#總共傳遞的參數個數是: $#"
echo "#當前程序運行的 PID 是: $$"
echo "#上一個命令執行的返回結果: $?"

#2.執行結果如下:
[root@gjy ~]# sh variable.sh linux python mysql
#當前shell腳本的文件名: variable.sh
#第1個shell腳本位置參數:linux
#第2個shell腳本位置參數:python
#第3個shell腳本位置參數:mysql
#所有傳遞的位置參數是: linux python mysql
#所有傳遞的位置參數是: linux python mysql
#總共傳遞的參數個數是: 3
#當前程序運行的 PID 是: 25285
#上一個命令執行的返回結果: 0
#3.這里需要注意 $*和$@的區別    
可以看到不加引號時,二者都是返回傳入的參數,但加了引號后    
$*把參數作為一個字符串整體(單字符串)返回,
$@把每個參數作為一個一個字符串返回#測試腳本如下:
[root@gjy ~]# cat test.sh
#! /bin/bash
test() {
echo "未加引號,二者相同"
echo $*
echo $@
echo "加入引號后對比"
for N in "$*"
do
echo $N
doneecho "----------"
for N in "$@"
do
echo $N
done
}
test 123 456 789
#執行結果如下:
[root@gjy ~]# sh test.sh
未加引號,二者相同123 456 789
123 456 789
加入引號后對比123 456 789
----------
123
456
789

總結:

重要的特殊位置變量
$0 腳本的名稱,如果全路徑執行腳本,則腳本名稱也帶全路徑, basename 獲取全腳本名稱

案例:給用戶提示如何使用此腳本
echo $"Usage: $0 {start |stop |status | restart |force-reload}"

$n 腳本的第n個參數, $0被腳本占用,從 $1開始,$9以后 ,需要加{}

$# 代表了腳本的傳參的總個數
案例: [ $# -ne 2 ] && echo " 你請輸入兩個參數 " && exit

$* 腳本的所有的傳參的參數,如果不加雙引號則和$@相同  加上雙引號則把所有參數視為一個整體

$@ 腳本的所有的傳參的參數  如果不加雙引號則和$* 相同, 加上雙引號則把所有參數視為獨立的參數
$* 和$@ 正常情況下一樣, 循環體內不同
 
$? 獲取上一條命令的結果,0為成功,非0 代表失敗

$$ 獲取腳本的pid
案例: 服務器運行大量的名稱相同的腳本
echo $$ > /tmp/count.pid

$! 上一個在后台運行腳本的pid, 調試使用

$_ 獲取腳本的最后一個參數,相當於Esc .

傳參的三種方式

1. 直接傳參
2.賦值傳參
3. read 傳參
#第一種傳參方式
echo $1 $2
#第二種
name= $1
age=$2
echo $name $age
read -p "請輸入名字和年齡" name1 age1
echo $name1 $age1


04. 位置是什么?在執行腳本的時候,在腳本后面寫入的內容,按空格分隔。

[root@gjy ~]# /etc/init.d/network
Usage: /etc/init.d/network {start|stop|status|restart|force-reload}
[root@gjy ~]# /etc/init.d/network status    #status就算第一個位置參數 $1其它位置變量:$2..$9 ${10}

05. 補充: 將命令執行的結果傳遞給變量。(命令替換)

#根據系統時間,打印今年時間和明年時間
[root@gjy ~]# echo "This is $(date +%Y) year"
This is 2019 year
[root@gjy ~]# echo "This is $(($(date +%Y)+1)) year"
This is 2020 year#自定義變量運算
[root@gjy ~]# age=18
[root@gjy ~]# echo $age
18
[root@gjy ~]# echo $(($age+1))
19
#命令的嵌套使用,使用$($())
[root@gjy ~]# mkdir oldboy
[root@gjy ~]# touch oldboy/{1..5}.txt
[root@gjy ~]# data=$(tar zcvf oldboy.tar.gz $(find /root/oldboy/ -name "*.txt"))
tar: Removing leading `/' from member names
[root@gjy ~]# echo $data
/root/oldboy/1.txt /root/oldboy/2.txt /root/oldboy/3.txt /root/oldboy/4.txt /root/oldboy/5.txt

2. Shell變量賦值

除了自定義變量,以及系統內置變量,還可以使用read命令通過交互式方式傳遞變量

01.read示例語法

#示例腳本:
[root@gjy ~/shell]# cat read1.sh
#!/bin/bash
read -p "提示信息:" var
echo "你輸入的變量是: $var "
#執行腳本
[root@gjy ~/shell]# sh read1.sh
提示信息:oldboy
你輸入的變量是: oldboy

02.read示例語法,簡單備份場景

#示例腳本:
[root@gjy ~/shell]# cat read2.sh
#!/bin/bash
read -p "你要備份的目錄是:" back
echo "你要備份的目錄是: $back "
echo "-------------backuping $back ---------------"
echo "-------------backup done $back -------------"#執行腳本
[root@gjy ~/shell]# sh read2.sh
你要備份的目錄是:/data
你要備份的目錄是: /data
-------------backuping /data ---------------
-------------backup done /data -------------

03. read示例語法,測試用戶輸入的IP是否通

1)執行腳本時,提示:請輸入ip.
2)使用ping命令去探測用戶輸入的IP是否通.
3)如果通則返回存活,如果不通則返回失敗.#示例腳本:
[root@gjy ~/shell]# cat read3.sh
#!/bin/bash
#1.提示用戶輸入一個IP地址
read -p "請輸入需要檢測的IP地址: " IP

#2.使用ping命令檢測IP地址是否通訊
ping -W1 -c1 $IP &>/dev/null
rc=$?
#3.檢查上一次命令執行返回的狀態碼是否正常
if [ $rc -eq 0 ];then
    echo "$IP 能正常通信"
else
    echo "$IP 無法正常通信"
fi

#執行腳本
[root@gjy ~/shell]# sh read3.sh
請輸入需要檢測的IP地址: 223.5.5.5
223.5.5.5 能正常通信
[root@gjy ~/shell]# sh read3.sh
請輸入需要檢測的IP地址: 233.5.5.5
233.5.5.5 無法正常通信
#echo命令輸出顏色。echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 紅色字 \033[0m"
echo -e "\033[32m 綠色字 \033[0m"
echo -e "\033[33m 黃色字 \033[0m"
echo -e "\033[34m 藍色字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m"
echo -e "\033[36m 天藍字 \033[0m"
echo -e "\033[37m 白色字 \033[0m"

[root@gjy ~/shell]# cat read3.sh
#!/bin/bash
#1.提示用戶輸入一個IP地址
read -p "請輸入需要檢測的IP地址: " IP
#2.使用ping命令檢測IP地址是否通訊
ping -W1 -c1 $IP &>/dev/null
rc=$?
#3.檢查上一次命令執行返回的狀態碼是否正常
if [ $rc -eq 0 ];then
    echo -e "\033[32m $IP 能正常通信 \033[0m"
else
    echo -e "\033[31m $IP 無法正常通信 \033[0m"
fi

[root@gjy ~/shell]# sh read3.sh
請輸入需要檢測的IP地址: 223.5.5.5
223.5.5.5 能正常通信

[root@gjy ~/shell]# sh read3.sh
請輸入需要檢測的IP地址: 233.5.5.5
233.5.5.5 無法正常通信

04. 使用read 命令寫一個腳本修改主機名

1)提示用戶輸入主機名稱.
2)詢問用戶是否確此操作.
3)真的執行.#示例腳本
[root@gjy ~/shell]# cat read4.sh
#!/bin/bash
#1.提示用戶輸入新的主機名稱,然后打印新的主機名稱
read -p "請輸入你想修改的主機名稱: " HostName
echo "你將要修改的主機名稱為: $HostName"
#2.是否確認修改,如果確認則真的執行shell命令,如果不確認則退出
read -p "你確定真的要修改如下內容嗎[Y|N]? " readly
#3.判斷用戶輸入的是Y還是N,如果是Y則真的執行,如果是其他則退出
if [ $readly == "Y" ];then
    hostnamectl set-hostname $HostName && bash
else
    exit
fi
#執行腳本
[root@gjy ~/shell]# sh read4.sh
請輸入你想修改的主機名稱: web
你將要修改的主機名稱為: web
你確定真的要修改如下內容嗎[Y|N]? N
[root@gjy ~/shell]# sh read4.sh
請輸入你想修改的主機名稱: web
你將要修改的主機名稱為: web
你確定真的要修改如下內容嗎[Y|N]? Y

05. 使用read命令寫一個腳本修改ip地址

1)提示用戶輸入新的ip地址主機位.
2)詢問用戶是否確此操作.
3)真的執行.#示例腳本:
[root@gjy ~/shell]# cat read5.sh
#!/bin/bash
#1.提示用戶輸入新的ip地址主機位,然后打印新的ip地址主機位
read -p "請輸入你想修改的新的ip地址主機位: " IP
echo "你將要修改的新的ip地址主機位為: $IP"
#2.是否確認修改,如果確認則真的執行shell命令,如果不確認則退出
read -p "你確定真的要修改如下內容嗎[Y|N]? " readly
#3.判斷用戶輸入的是Y還是N,如果是Y則真的執行,如果是其他則退出
if [ $readly == "Y" ];then
oldip=`ifconfig eth0 |awk -F '[ .]+' 'NR==2{print $6}'`
sed -i "s#${oldip}#${IP}#g" /etc/sysconfig/network-scripts/ifcfg-eth[01] && \
    systemctl restart network
else
exit
fi
#執行腳本
[root@gjy ~/shell]# sh read5.sh
請輸入你想修改的新的ip地址主機位: 90
你將要修改的新的ip地址主機位為: 90
你確定真的要修改如下內容嗎[Y|N]? Y
#卡住,重新連接新的IP地址進行連接登錄。

3. Shell變量替換

變量說明

${#變量} 獲取變量值的長度

${變量#匹配規則} 從頭開始匹配,最短刪除

${變量##匹配規則} 從頭開始匹配,最長刪除

${變量%匹配規則} 從尾開始匹配,最短刪除

${變量%%匹配規則} 從尾開始匹配,最長刪除

${變量/舊字符串/新字符串} 替換變量內的舊字符串為新字符串,只替換第一個

${變量//舊字符串/新字符串} 替換變量內的舊字符串為新字符串,全部替換

${變量:匹配規則:匹配規則} 索引及切片

01. 從前往后刪除變量內容

[root@gjy ~/shell]# url=www.sina.com.cn     #定義變量
[root@gjy ~/shell]# echo ${url}     #輸出變量的值
www.sina.com.cn
[root@gjy ~/shell]# echo ${url#*.}         #從前往后,最短匹配
sina.com.cn
[root@gjy ~/shell]# echo ${url##*.}         #從前往后,最長匹配
cn

02. 從后往前刪除變量內容

[root@gjy ~]# url=www.sina.com.cn             #定義變量
[root@gjy ~]# echo ${url}             #輸出變量結果
www.sina.com.cn
[root@gjy ~]# echo ${url%.*}             #從后往前,最短匹配
www.sina.com
[root@gjy ~]# echo ${url%%.*}             #從后往前,最長匹配
貪婪匹配
www

03. 變量內容替換

[root@gjy shell01]# echo ${url}                
www.sina.com.cn
[root@gjy shell01]# echo ${url/n/N}            
www.siNa.com.cn
[root@gjy shell01]# echo ${url//n/N}        
www.siNa.com.cN

04. 索引及切片

[root@gjy ~/shell]# echo ${url:0:5}            #從0列開始,切出5列,第0-4列
www.s
[root@gjy ~/shell]# echo ${url:5:5}            #從5列開始,切出5列,第5-9列
ina.c
[root@gjy ~/shell]# echo ${url:5}            #去除前5列
ina.com.cn

案例,查詢長度

[root@web01 ~]# echo $name
I am gjy
[root@web01 ~]# echo $name|awk '{print length}'
8
[root@web01 ~]# expr length "$name"
8
[root@web01 ~]# echo  ${#name}
8

05. 場景實踐一:查看內存當前使用狀態,如果使用率超過80%則報警發郵件

1.如何查看內存         #free -m
2.如何查看內存百分比        #使用的/總的*100=使用百分比 free -m|awk '/^Mem/ {print $3/$2*100}'#示例腳本
[root@gjy ~/shell]# cat mem_used.sh
#!/bin/bash
# 監控內存使用百分比,超過百分之80則報警
free_use=$(free -m|awk '/^Mem/ {print $3/$2*100}')
if [ ${free_use%.*} -gt 80 ];then
    echo "你的內存超過了百分之80,當前是${free_use}%"
else
    echo "你的內存正常使用,當前是${free_use}%"
fi#執行腳本
[root@gjy ~/shell]# sh mem_used.sh
你的內存正常使用,當前是9.0535%

06. 場景實踐二:在每月第一天備份並壓縮/etc目錄的所有內容,存放到/root/bak目錄,存放的形式 2019-06-20_etc.tar.gz,腳本名稱為fileback,存放在/root的家目錄下。

01)備份什么?    
02)備份到哪?    
03)使用什么方式?
04)備份的周期?    #腳本如下:
[root@gjy ~/shell]# cat fileback.sh
#!/usr/bin/bash
DestPath=/root/bak
Date=$(date +%F)
#1.准備目標位置
[ ! -d $DestPath ] && mkdir -p $DestPath
#2.備份到目標位置
tar czf $DestPath/${Date}_etc.tar.gz /etc
[root@gjy ~/shell]# sh fileback.sh#執行腳本:
[root@gjy ~/shell]# sh fileback.sh
tar: Removing leading `/' from member names#查看結果
[root@gjy ~/shell]# ll /root/bak/2019-06-25_etc.tar.gz
-rw-r--r-- 1 root root 10229422 Jun 25 17:15 /root/bak/2019-06-25_etc.tar.gz

07. 場景實踐三:在/backup下創建10個.txt的文件,找到/backup目錄下所有后綴名為.txt的文件

1)批量修改txt為txt.bak                        
2)把所有的.bak文件打包壓縮為123.tar.gz        
3)批量還原文件的名字,及把增加的.bak再刪除
方法一:
[root@gjy ~/shell]# cat mv.sh
#!/usr/bin/bash
dir=/backup
#1.判斷目錄是否存在,不存在則創建
if [ -d $dir ];then
    echo " $dir已存在"
else
    echo " $dir不存在,現在創建" && mkdir -p $dir                        
fi
#創建10個文件
touch $dir/{1..10}.txt
#2.批量修改名稱
find $dir -type f -name "*.txt" > $dir/txt.log
sed -r 's#(.*)#mv \1 \1.bak#g' $dir/txt.log |bash
#3.打包壓縮
tar czf $dir/123.tar.gz $dir/*.bak
#4.還原
find $dir -type f -name "*.bak" > $dir/bak.log
sed -r 's#(.*).bak#mv \1.bak \1#g' $dir/bak.log|bash

方法二:
[root@gjy ~/shell]# cat rename.sh
#!/bin/bash
#定義變量T=txt
B=bak
#把backup目錄下.txt結尾的文件修改成txt.bak
cd /backup && rename $T $T\.$B *.txt
#把所有的.bak結尾的文件打包壓縮為123.tar.gz
tar zcvf /backup/123.tar.gz /backup/*.bak
#還原文件的名字rename $T\.$B $T 
*方法三:
[root@gjy ~/shell]# cat for_name.sh
#!/bin/bash
dir=/backup
#1.判斷目錄是否存在,不存在則創建
[ -d $dir ] || mkdir -p $dir
#創建10個文件
touch $dir/{1..10}.txt
#批量修改文件名
find $dir -type f -name "*.txt" >$dir/txt.log
#2.使用for循環進行修改名
for i in $(cat $dir/txt.log)
do
mv $i $i.bak
done
#3.打包壓縮
tar czf $dir/123.tar.gz  $dir/*.bak
#4.批量還原
find $dir -type f -name "*.bak" > $dir/bak.log
for j in $(cat $dir/bak.log)
do
mv $j ${j%.*}
done

4. Shell變量運算

01. 整數運算,expr、\((())、\)[],不支持小數運算

操作符含義

num1 + num2 求加

num1 - num2 求減

num1 * num2 求積

num1 / num2 求商

num1 % num2 求余

#定義變量,使用expr、$(())、$[]、let進行加減乘除。expr必須空格隔開。
#expr
[root@gjy ~/shell]# num1=20
[root@gjy ~/shell]# num2=10
[root@gjy ~/shell]# expr $num1 + $num2
30
[root@gjy ~/shell]# expr $num1 - $num2
10
[root@gjy ~/shell]# expr $num1 * $num2
expr: syntax error
[root@gjy ~/shell]# expr $num1 \* $num2
200
[root@gjy ~/shell]# expr $num1 / $num2
2
[root@gjy ~/shell]# expr $num1 % $num2
0

#$(())
[root@gjy ~/shell]# echo $(( $num1 + $num2 ))
30
[root@gjy ~/shell]# echo $(( $num1 - $num2 ))
10
[root@gjy ~/shell]# echo $(( $num1 * $num2 ))
200
[root@gjy ~/shell]# echo $(( $num1 / $num2 ))
2
[root@gjy ~/shell]# echo $(( $num1 % $num2 ))
0
#$[]
[root@gjy ~/shell]# echo $[ $num1 + $num2 ]
30
[root@gjy ~/shell]# echo $[ $num1 - $num2 ]
10
[root@gjy ~/shell]# echo $[ $num1 * $num2 ]
200
[root@gjy ~/shell]# echo $[ $num1 / $num2 ]
2
[root@gjy ~/shell]# echo $[ $num1 % $num2 ]
0

#let
[root@gjy /scripts]# a=1
[root@gjy /scripts]# let a++
[root@gjy /scripts]# echo $a
2
[root@gjy /scripts]# let a++
[root@gjy /scripts]# echo $a
3
[root@gjy /scripts]# let a--
[root@gjy /scripts]# echo $a
2

02. 小數運算bc(支持求方)、awk(支持求方)、Python

#需要下載此命令
[root@gjy ~/shell]# yum install bc -y
[root@gjy ~/shell]# num1=10
[root@gjy ~/shell]# num2=20
[root@gjy ~/shell]# echo $num1+$num2 |bc
30
[root@gjy ~/shell]# echo $num1-$num2 |bc
-10
[root@gjy ~/shell]# echo $num1*$num2 |bc
200
[root@gjy ~/shell]# echo $num1/$num2 |bc
0
[root@gjy ~/shell]# echo "scale=2;$num1/$num2" |bc
.50
[root@gjy ~/shell]# echo $num1^$num2 |bc
100000000000000000000
[root@gjy ~/shell]# echo $num1%$num2 |bc
10
#awk
[root@gjy ~/shell]# awk "BEGIN{print $num1 + $num2 }"
30
[root@gjy ~/shell]# awk "BEGIN{print $num1 / $num2 }"
0.5
[root@gjy ~/shell]# awk "BEGIN{print $num1 - $num2 }"
-10
[root@gjy ~/shell]# awk "BEGIN{print $num1 * $num2 }"
200
[root@gjy ~/shell]# awk "BEGIN{print $num1 / $num2 }"
0.5
#指定小數位
[root@gjy ~/shell]# awk 'BEGIN{printf "%.2f\n",1/2}'
0.50
[root@gjy ~/shell]# awk "BEGIN{print $num1 ^ $num2 }"
100000000000000000000
[root@gjy ~/shell]# awk "BEGIN{print $num1 % $num2 }"
10

#Python
[root@gjy ~/shell]# echo "print $num1+$num2" |python
30
[root@gjy ~/shell]# echo "print $num1-$num2" |python
-10
[root@gjy ~/shell]# echo "print $num1*$num2" |python
200
[root@gjy ~/shell]# echo "print $num1/$num2" |python
0
[root@gjy ~/shell]# echo "print ${num1}.0/$num2" |python
0.5
[root@gjy ~/shell]# echo "print $num1%$num2" |python
10
**03. 變量運算案例**
案例1: 求ps axu中的VSZ列的和
[root@web02 shell]# ps aux |awk  'NR>=2 {print $5}'|awk '{sum+=$1}END {print sum}'
17039904
[root@web02 shell]# ps aux |awk  'NR>=2 {print $5}'|tr "\n" "+" |sed -r 's#(.*)\+#\1\n#g'|bc
16849512
[root@web02 shell]# ps aux |awk  'NR>=2 {print $5}'|awk '{i+=$1}END{print i}'
17084196

03. 變量運算案例

案例2:做一個加減乘除的計算器例如:
請輸入第一個數字 10
請輸入第二個數字 20
顯示的結果 10+20=30[root@gjy ~/shell]# cat count.sh
#!/bin/bash
read -p "請輸入第一個數字: " num1
read -p "請輸入第二個數字: " num2
echo "$num1+$num2=$[$num1+$num2]"
echo "$num1-$num2=$[$num1-$num2]"
echo "$num1*$num2=$[$num1*$num2]"
echo "$num1/$num2=$[$num1/$num2]"

5. Shell變量案例

01. 使用Shell腳本打印,系統版本、內核版本平台、虛擬平台、靜態主機名、eth0網卡IP地址、lo網卡IP地址、當前主機的外網IP地址curl icanhazip.com

#示例腳本如下:[root@gjy ~/shell]# sh status.sh
#!/usr/bin/bash
System=$(hostnamectl |grep System|awk '{print $3,$4,$5}')
Kernel=$(hostnamectl|grep Kernel|awk -F: '{print $2}')
Vt=$(hostnamectl|grep Virtualization|awk '{print $2}')
Statichostname=$(hostnamectl|grep "Static hostname"|awk '{print $3}')
Eth0=$(ifconfig eth0|awk 'NR==2{print $2}')
Lo=$(ifconfig lo|awk 'NR==2{print $2}')
Network_T=$(curl -s icanhazip.com)
echo "當前系統版本是: $System"
echo "當前系統內核是: $Kernel"
echo "當前虛擬平台是: $Vt"
echo "當前靜態主機名是: $Statichostname"
echo "當前Eth0IP地址是: $Eth0"
echo "當前lo地址是: $Lo"
echo "當前外網地址是: $Network_T"

#執行腳本
[root@gjy ~/shell]# sh status.sh
當前系統版本是: CentOS Linux 7
當前系統內核是: Linux 3.10.0-957.el7.x86_64
當前虛擬平台是: vmware
當前靜態主機名是: gjy
當前Eth0IP地址是: 10.0.0.90
當前lo地址是: 127.0.0.1
當前外網地址是: 139.226.173.12

02. 需求描述:變量string="Bigdata process is Hadoop, Hadoop is open source project",執行腳本后,打印輸出string變量,並給出用戶以下選項:

#需求
1)打印string長度
2)刪除字符串中所有的Hadoop
3)替換第一個Hadoop為Linux
4)替換全部Hadoop為Linux
用戶請輸入數字1|2|3|4,可以執行對應項的功能。
#腳本如下:
[root@gjy ~/shell]# cat variable.sh
#!/usr/bin/bash
string="Bigdata process is Hadoop, Hadoop is open source project"
echo $string
cat <<EOF
1)、打印string長度
2)、刪除字符串中所有的Hadoop
3)、替換第一個Hadoop為Linux
4)、替換全部Hadoop為Linux
EOF
read -p "請輸入數字1|2|3|4: " var
if [ $var -eq 1 ];then
    echo 當前string變量的長度是: ${#string}
#echo 當前string變量的長度是: echo ${string}|wc -L    
fi
if [ $var -eq 2 ];then
    echo ${string//Hadoop/}
fi
if [ $var -eq 3 ];then
    echo ${string/Hadoop/Linux}
fi
if [ $var -eq 4 ];then
    echo ${string//Hadoop/Linux}
fi
#執行腳本
[root@gjy ~/shell]# sh variable.sh
Bigdata process is Hadoop, Hadoop is open source project
1)、打印string長度
2)、刪除字符串中所有的Hadoop
3)、替換第一個Hadoop為Linux
4)、替換全部Hadoop為Linux
請輸入數字1|2|3|4,或q|Q: 1
當前string變量的長度是: 57
[root@gjy ~/shell]# sh variable.sh
Bigdata process is Hadoop, Hadoop is open source project
1)、打印string長度
2)、刪除字符串中所有的Hadoop
3)、替換第一個Hadoop為Linux
4)、替換全部Hadoop為Linux
請輸入數字1|2|3|4,或q|Q: 2
Bigdata process is , is open source project
[root@gjy ~/shell]# sh variable.sh
Bigdata process is Hadoop, Hadoop is open source project
1)、打印string長度
2)、刪除字符串中所有的Hadoop
3)、替換第一個Hadoop為Linux
4)、替換全部Hadoop為Linux
請輸入數字1|2|3|4,或q|Q: 3
Bigdata process is Linux, Hadoop is open source project
[root@gjy ~/shell]# sh variable.sh
Bigdata process is Hadoop, Hadoop is open source project
1)、打印string長度
2)、刪除字符串中所有的Hadoop
3)、替換第一個Hadoop為Linux
4)、替換全部Hadoop為Linux
請輸入數字1|2|3|4,或q|Q: 4
Bigdata process is Linux, Linux is open source project

取出下列字符串長度小於3的單詞,I am qiuzengjia teacher I am 18。

[root@web02 backup]# cat bbb.sh 
#!/bin/bash
abc="I am qiuzengjia teacher I am 18"
echo $abc
for i in $abc
do
    if [ ${#i} -lt 3 ];then
         echo "長度小於3:$i"
    else
        echo "長度大於或等於3: $i"
    fi
done  
[root@web02 backup]# sh bbb.sh 
I am qiuzengjia teacher I am 18
長度小於3:I
長度小於3:am
長度大於或等於3: qiuzengjia
長度大於或等於3: teacher
長度小於3:I
長度小於3:am
長度小於3:18

命令行查詢

[root@web01 ~]# echo  $name
I am gjy
[root@web01 ~]# echo  $name |xargs -n1
I
am
gjy
[root@web01 ~]# echo  $name |xargs -n2
I am
gjy

#查詢長度
[root@web01 ~]# echo  $name |xargs -n1|awk '{print length}'
1
2
3

#判斷長度小於3
方法一:
[root@web01 ~]# echo  $name |xargs -n1|awk '{if(length<3)print}'
I
am
方法二
[root@web01 ~]# echo  $name |awk '{for (i=1;i<=NF;i++)if(length($i)<3)print $i}'
I
am


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM