【shell】shell變量

【shell學習】shell變量

1.自定義變量

變量值,只能以字母或下劃線開口,變量引用 $變量名 或 ${變量名},取消變量 unset

[klaus@localhost learn]$ ip=4.2.2.2
[klaus@localhost learn]$ echo $ip
4.2.2.2
[klaus@localhost learn]$ echo ${ip}
4.2.2.2
[klaus@localhost learn]$ unset ip
[klaus@localhost learn]$ echo ${ip}

上述的變量爲shell內部的變量,如果需要設置環境變量,就要用到export

[klaus@localhost learn]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/klaus/.local/bin:/home/klaus/bin
[klaus@localhost learn]$ sudo mkdir -p /new/path
[klaus@localhost learn]$ PATH=$PATH:/new/path/
[klaus@localhost learn]$ export PATH
[klaus@localhost learn]$ echo $PATH             
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/klaus/.local/bin:/home/klaus/bin:/new/path/

當然你也可以用source命令更新變量環境,不過當前export設置的變量僅爲臨時變量,下一次登錄就沒有了,如果想要寫成永久的環境變量,直接在~/.bash_profile後面添加就行,加的過程用“:”分隔。

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs
                                                                                                                                                                                                         
PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

2.變量引用

2.1 直接引用,如在腳本中定義變量並引用

[klaus@localhost learn]$ cat ping03.sh
#!/usr/bin/bash
ip1=4.2.2.2

ping -c1 $ip1 &>/dev/null
if [ $? -eq 0 ];then
        echo "$ip1 is ok!"
else
        echo "$ip1 is fail!"
fi
[klaus@localhost learn]$ ./ping03.sh
4.2.2.2 is ok!

其中,$?返回上一次運行的結果,成功則爲0,不成功則返回非0值

2.2 腳本交叉使用

比如我需用到其他文件裏面定義的參數,具體做法子腳本加載,用“.”或者“source”執行,執行shell爲當前shell

[klaus@localhost learn]$ cat ping08.sh
  /usr/bin/bash
ping -c1 $ip1 &>/dev/null
if [ $? -eq 0 ];then
        echo "$ip1 is ok!"
else
        echo "$ip1 is fail!"
fi
[klaus@localhost learn]$ ./ping08.sh
is fail!
[klaus@localhost learn]$ cat public.sh
#!/usr/bin/bash
ip1=4.2.2.2
dir_path=/etc/
[klaus@localhost learn]$ vim ping08.sh
[klaus@localhost learn]$ cat ping08.sh
#!/usr/bin/bash
. ./public.sh    # 其中2個點之間有空格,用source ./public.sh也可以
ping -c1 $ip1 &>/dev/null
if [ $? -eq 0 ];then
        echo "$ip1 is ok!"
else
        echo "$ip1 is fail!"
fi
[klaus@localhost learn]$ ./ping08.sh
4.2.2.2 is ok!

3.位置變量和預定義變量

$1,$2,$3,$4,$5表示位置變量,表示第幾個位置;00腳本名,*所有參數,$@所有參數等都是預定義變量

[klaus@localhost learn]$ ./posTest.sh AA BB CC DD ZZ XX
腳本名爲:posTest.sh
執行腳本路徑爲:.
第三個位置的參數是:BB
所有參數是:AA BB CC DD ZZ XX
所有參數是:AA BB CC DD ZZ XX
當前參數總個數是:6
當前進程的PID是:91236
[klaus@localhost learn]$ cat posTest.sh
#!/usr/bin/bash
echo "腳本名爲:`basename $0`"
echo "執行腳本路徑爲:`dirname $0`"
echo "第三個位置的參數是:$2"
echo "所有參數是:$*"
echo "所有參數是:$@"
echo "當前參數總個數是:$#"
echo "當前進程的PID是:$$"

其中, *和@的區別主要是$*會將整個命令行內容當中一個整體,而 $@會區分各個參數。
這個的basename的作用主要是截取最後的文件名,相對應的dirname的作用是取對應的文件名之前的路徑

[klaus@localhost learn]$ basename /usr/bin/python
python
[klaus@localhost learn]$ dirname /usr/bin/python
/usr/bin

4.變量的賦值與鍵盤讀入

顯示賦值,直接賦值給變量

[klaus@localhost learn]$ name="klaus MJ"
[klaus@localhost learn]$ echo $name
klaus MJ
[klaus@localhost learn]$ discp="$name is a handsome"
[klaus@localhost learn]$ echo $discp
klaus MJ is a handsome

鍵盤讀入,規則read 變量名

[klaus@localhost chapt2]$ read ip
4.2.2.2
[klaus@localhost chapt2]$ echo $ip
4.2.2.2
[klaus@localhost chapt2]$ read -p "please input a ip:" ip1
please input a ip:4.2.2.3
[klaus@localhost chapt2]$ echo $ip1
4.2.2.3

read還支持倒計時功能,例如read -t 5 “提示信息” 變量:表示倒計時5s。

多個變量輸入,-p表示提示

[klaus@localhost chapt2]$ read ip2 ip3 ip4
4.2.2.4 4.2.2.5 4.2.2.6
[klaus@localhost chapt2]$ echo $ip3
4.2.2.5
[klaus@localhost chapt2]$ read -p "輸入姓名,性別,年齡:" name sex age
輸入姓名,性別,年齡:klaus man 20
[klaus@localhost chapt2]$ echo $name
klaus

5.強弱引用

在shell中,’'表示強引用,""表示若引用

[klaus@localhost chapt2]$ boy="$name is  good\!";echo $boy
klaus is good\!
[klaus@localhost chapt2]$ boy1='$name is  good!';echo $boy1
$name is good!
[klaus@localhost chapt2]$ boy2='\$name is  good!';echo $boy2
\$name is good!
[klaus@localhost chapt2]$

''是常引用,沒有變量,""內部,變量還是變量,會被替換成相應的值。

6.命令替換

命令替換用反引號``或者$( ),被引起來或者括號內部的內容會被shell先執行

[klaus@localhost chapt2]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        18G   17G     0 100% /
tmpfs           490M  232K  490M   1% /dev/shm
/dev/sda1       283M   67M  201M  25% /boot
[klaus@localhost chapt2]$ disk_size=`df -h | grep '/$' | awk '{print $2}'`
[klaus@localhost chapt2]$ echo $disk_size
18G
[klaus@localhost chapt2]$ disk_size1=$(df -h | grep '/$' | awk '{print $2}')
[klaus@localhost chapt2]$ echo $disk_size1
18G
[klaus@localhost chapt2]$ disk_size2="df -h | grep '/$' | awk '{print $2}'"    
[klaus@localhost chapt2]$ echo $disk_size2
df -h | grep '/$' | awk '{print }'

用雙引號引起來的內容完全起不到先執行的效果。

7.變量運算

shell的基本運算爲’+’,’-’,’*’,’/’,’%’,有具體以下幾種形式
法一、expr $num1 + $num2

[klaus@localhost chapt2]$ expr 1 + 3
4
[klaus@localhost chapt2]$ expr 7 * 23
161

法二、 $(( ))直接運算

[klaus@localhost chapt2]$ echo $((1+23))
24
[klaus@localhost chapt2]$ echo $((7*19))
133

法三、$[ ],同上,也是在括號內部直接計算
法四、let 條件,如

[klaus@localhost chapt2]$ let sum=2+9;echo $sum
11

法五、調用計算器

[klaus@localhost chapt2]$ echo "2^4" | bc
16
[klaus@localhost chapt2]$ echo "1/4" | bc  
0

小數計算,通常採用截取的辦法

[klaus@localhost chapt2]$ echo "scale=2; 1/4" | bc  # scale表示保留的小數點位數
.25
[klaus@localhost chapt2]$ awk 'BEGIN {print 1/4}'
0.25
[klaus@localhost chapt2]$ echo "print 1.0/4.0" | python  #調用python
0.25

8.索引切片

shell同樣支持切片功能

[klaus@localhost chapt2]$ url=www.baidu.com
[klaus@localhost chapt2]$ echo $url
www.baidu.com
[klaus@localhost chapt2]$ echo ${url:0:5}
www.b
[klaus@localhost chapt2]$ echo ${url:5:5}  
aidu.
[klaus@localhost chapt2]$ echo ${url:5}   
aidu.com
[klaus@localhost chapt2]$

第一個0代表起始的位置,第二個0代表多少位,第二個參數如果沒有的話,就默認爲後面的所有。

9,變量替換

變量替換的原則是,變量如果有就不替換,包括空格,替換規則:${變量名-新的變量名}

[klaus@localhost chapt2]$ va1=
[klaus@localhost chapt2]$ va2=111
[klaus@localhost chapt2]$ echo $va1;echo $va2

111
[klaus@localhost chapt2]$ unset va2
[klaus@localhost chapt2]$ echo $va2      

[klaus@localhost chapt2]$ echo ${va2-222}    
222
[klaus@localhost chapt2]$ echo ${va1-333}

[klaus@localhost chapt2]$

同樣,如果用${變量名:-新的變量名},這裏空格也會被替代,其他同上面一樣

[klaus@localhost chapt2]$ va3=
[klaus@localhost chapt2]$ echo ${va3:-333}
333
發佈了81 篇原創文章 · 獲贊 87 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章