1. 程式人生 > 其它 >shell-02-變數

shell-02-變數

一、變數的介紹

  1、什麼是變數?

1、量指的是記錄事物的狀態/
2、變指的是事物的狀態是可以發生變化的/
3、變數本質就是一種資料存取的機制,變數的資料都是存放於記憶體中的

  2、為何要有變數? 

PS:程式執行的本質就是一系列狀態的變化
程式=資料+功能,
程式執行的本質就是一系列狀態的變化,變是程式執行的直接體現,所以我們需要有一種機制能夠反映或者說是儲存下來程式執行時狀態以及狀態的變化。

二、變數的使用

  1、先定義、後使用

1、變零先定義:
# 1、語法:變數名=值
# 2、注意:等號左右兩邊不能有空格!!!
# 3、例如:
[root@nj-mg-10-11-20-8 day01]# name=magb

2、後引用: [root@nj-mg-10-11-20-8 day01]# name=magb [root@nj-mg-10-11-20-8 day01]# echo $name magb [root@nj-mg-10-11-20-8 day01]# ip="10.21.10.17" [root@nj-mg-10-11-20-8 day01]# echo $ip 10.21.10.17

  2、刪除變數的方法:

[root@nj-mg-10-11-20-8 day01]# x=123456
[root@nj-mg-10-11-20-8 day01]# echo $x
123456
[root@nj-mg-10-11-20-8 day01]# unset x
[root@nj
-mg-10-11-20-8 day01]# echo $x [root@nj-mg-10-11-20-8 day01]#

三、變數

  1、變數的三大組成部分

1、變數名:用來訪問到變數值的
2、賦值符號:將變數值的記憶體地址繫結給變數名
3、變數值:即我們存的資料

  2、變數的命名規範

PS:定義變數把資料存到記憶體中不是目的,目的是以後要取出來用,而變數名就是用來取變數值的,而變數的名字直接表明了所存值的意義,可見變數名的命名非常重要

變數名的命令應該見名知意,同時遵循如下規則:
以字母或下劃線開頭,剩下的部分可以是:字母、數字、下劃線,
最好遵循下述規範:
    1.以字母開頭
    2.使用中劃線或者下劃線做單詞的連線
    3.同類型的用數字區分
    4.對於檔名的命名最好在末尾加上拓展名
    
例如: sql_bak.tar.gz,log_bak.tar.bz2  
    5、不要帶有空格、?、*等特殊字元
    6、不能使用bash中的關鍵字,例如if,for,while,do等
    7、不要和系統環境變數衝突

  3、變數的三種來源

    3.1、直接賦值

[root@nj-mg-10-11-20-8 day01]# today=`date +%F`
[root@nj-mg-10-11-20-8 day01]# echo $today
2021-06-16
[root@nj-mg-10-11-20-8 day01]# today1=$(date +%F)
[root@nj-mg-10-11-20-8 day01]# echo $today
2021-06-16
[root@nj-mg-10-11-20-8 day01]# url="www.baidu.com"
[root@nj-mg-10-11-20-8 day01]# ping -c1 $url
PING www.wshifen.com (103.235.46.39) 56(84) bytes of data.
64 bytes from 103.235.46.39: icmp_seq=1 ttl=42 time=271 ms

--- www.wshifen.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 271.180/271.180/271.180/0.000 ms

    3.2、從位置引數獲取變數值

[root@nj-mg-10-11-20-8 day01]# sh 01.sh 1 2 3 4 5  6 7 8  9 10
01.sh
1
2
3
4
5
6
7
8
9
10
[root@nj-mg-10-11-20-8 day01]# cat 01.sh
#!/bin/bash

echo $0
echo $1
echo $2
echo $3
echo $4
echo $5
echo $6
echo $7
echo $8
echo $9
echo ${10}

PS:從呼叫指令碼時傳入的位置引數獲取變數值:./b.sh a1 a2 a3
需要用到$n獲取第n個位置引數值,超過10需要用${n},

    3.2、與使用者互動獲取值

[root@nj-mg-10-11-20-8 day01]# ./first.sh
please input your name: magb
please input your password: 123
magb && 123
[root@nj-mg-10-11-20-8 day01]#
[root@nj-mg-10-11-20-8 day01]# cat first.sh
#!/bin/bash

read -p "please input your name: " user_name
read -p "please input your password: " user_pwd

echo "${user_name} && ${user_pwd}"
[root@nj-mg-10-11-20-8 day01]#

何為互動,即輸入、輸出
​# 一:read接收使用者的輸入,即從鍵盤讀入變數值
read 變數名
read -p "提示資訊: "  變數名
read -t 5 -p "提示資訊: "  變數名  # -t指定秒數
read -n 2 變數名  # -n讀取的字元個數
​
=======》應用示例:vim first.sh
back_dir1=/var/backup
read -p "請輸入你的備份目錄: " back_dir2
echo $back_dir1
echo $back_dir2
​企業使用:可以根據需求調整變數值,可以便於新員工快速掌握企業指令碼使用
​
# 二:輸出
# 2.1 echo命令,詳解情況:https://www.cnblogs.com/linhaifeng/articles/13976349.html
[root@egon ~~]# name="egon"
[root@egon ~~]# age=18
[root@egon ~~]# echo -e "my name is $name my age is $age"
my name is egon my age is 18
​
還可以輸出帶顏色(瞭解即可)
echo -e "\033[31m 紅色字 \033[0m"
echo -e "\033[34m 黃色字 \033[0m"
echo -e "\033[41;33m 紅底黃字 \033[0m"
echo -e "\033[41;37m 紅底白字 \033[0m"
 
# 2.2 prinf命令(C語言風格)
%s
%d
%7.3f  列印浮點數,總寬度為7,小數位保留3位,並且四捨五入
[root@egon ~~]# name="egon"
[root@egon ~~]# age=18
[root@egon ~~]# printf "my name is %s my age is %s\n" $name $age
my name is egon my age is 18        
​[root@egon ~]# salary=3.3339
[root@egon ~]# printf "my name is %s my age is %7.3f\n" $name $salary
my name is egon my age is   3.334

    3.3、預定義變數

$*  所有的引數
$@  所有的引數
$#  引數的個數
$$  當前程序的PID  # 此外,可以使用只讀變數來獲取父程序的PID:$PPID、獲取執行指令碼的使用者ID:$UID
$?  上一個命令的返回值 0表示成功 
​
​示例1:
[root@egon ~]# chmod +x b.sh 
[root@egon ~]# ./b.sh a1 a2 a3 a4 a5
a1 a2 a3 a4 a5
a1 a2 a3 a4 a5
5
18988
1
[root@egon ~]# cat b.sh 
#!/usr/bin/env bash
echo $*
echo $@
echo $#
echo $$
​
ping -c1 192.168.11.10 &>/dev/null
echo $?
​
示例2:
[root@egon ~]# vim ping.sh
#!/bin/bash                         
ping -c2 $1 &>/dev/null     
if [ $? = 0 ];then                  
    echo "host $1 is ok"        
else                                            
    echo "host $1 is fail"  
fi
​
[root@egon ~]# chmod +x ping.sh
[root@egon ~]# ./ping.sh 192.168.11.10

    3.4、瞭解的知識點:

如果我們想從命令列中獲取指令碼呼叫者傳入的引數值,用$n可以取到,但如果指令碼呼叫者在命令列傳入的引數個數不固定,那麼此時就需要用$*或$@來獲取了
​
$*與$@獲取的是所有位置引數,$0除外

當指令碼呼叫者的傳參形式如下是:
[root@localhost ~]# ./script.sh 命令1 命令2 命令3

針對for迴圈語句:for i in 元素,for迴圈會按照空格作為分隔符來一個個取元素,所以此時$*與$@並無區別
[root@localhost ~]# cat script.sh 
#!/bin/bash
​
for i in $*
do
    echo $i
doneecho "=================="for i in $@
do
    echo $i
done
[root@localhost ~]# 
[root@localhost ~]# ./script.sh 命令1 命令2 命令3
命令1
命令2
命令3
==================
命令1
命令2
命令3

當指令碼呼叫者的傳參形式如下時:
[root@localhost ~]# ./script.sh 命令1 命令2 "命令3 引數"
針對for迴圈語句:for i in 元素,for迴圈會按照空格作為分隔符來一個個取元素,所以此時$*與$@如果不加引號,第三個命令:"命令3 引數",為被以空格為分隔符識別成兩部分
[root@localhost ~]# cat script.sh 
#!/bin/bash
​
for i in $*
do
    echo $i
doneecho "=================="for i in $@
do
    echo $i
done
[root@localhost ~]# 
[root@localhost ~]# ./script.sh 命令1 命令2 "命令3 引數"
命令1
命令2
命令3
引數
==================
命令1
命令2
命令3
引數

所以需要為$*與$@加上引號
[root@localhost ~]# cat script.sh 
#!/bin/bash
​
for i in "$*"
do
    echo $i
doneecho "=================="for i in "$@"
do
    echo $i
done
[root@localhost ~]# ./script.sh 命令1 命令2 "命令3 引數"
命令1 命令2 命令3 引數
==================
命令1
命令2
命令3 引數
[root@localhost ~]# 

但此時為$*就會把所有位置引數識別成一個整體,所以總結如下:
當指令碼呼叫者的傳參形式如下時
[root@localhost ~]# ./script.sh 命令1 命令2 "命令3 引數"
​
需要使用"$@"來分別獲取一個個完整的命令
for i in "$@"
do
    echo $i
done
​
其餘情況$*與$@完全一致

    3.5、常量

相對於變數,常量就是不可以被改變的量,即只能讀不能改,所以又稱之為只讀變數:
使用 readonly 命令可以將變數定義為只讀變數,只讀變數的值不能被改變。
​
[root@egon ~]# x=111
[root@egon ~]# readonly x
[root@egon ~]# x=666
-bash: x: 只讀變數