【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表示位置變量,表示第幾個位置;*所有參數,$@所有參數等都是預定義變量
[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