shell中的變數及函式
############################1.變數###########################################
########簡介:
(1)什麼是變數?
變數即在程式執行過程中它的值是允許改變的量,變數是用一串固定的字元來標誌不固定的值的一種方法,變數是一種使用方便的佔位符,用於引用計算機記憶體地址,該地址可以儲存scripts執行時可更改的程式資訊。在shell 中變數是不可能永久儲存在系統中的,必須在檔案中宣告。
(2)都有哪些變數?
在shell中變數分為環境級變數,使用者級變數,系統級變數, 環境級變數只在當前shell中生效,shell關閉變數丟失, 使用者級變數寫在使用者的骨檔案中,只針對當前使用者有效, 系統級變數被寫在系統的配置檔案/etc/profile中 ,變數即在程式執行時儲存在記憶體中。 硬碟永久,記憶體臨時的。
使用者級的變數(相對於系統級檔案後被載入) 在./profile中定義
系統級的變數 在/etc/profile中定義
環境級的變數 a=1 export a=1
變數名稱的規範:
########各種級別下的變數
(1)環境級: export A=1
(2)使用者級: vim ~/.bash_profile
新增:export A=1
//檢視不到變數的值是因為在不同的shell環境,新的shell會載入不同的配置檔案覆蓋原來的
(3)系統級: vim /etc/profile新增:export A=1
所有使用者都可以共享變數資源。
實戰演練
eg:實現用相對路徑執行指令碼(這是臨時的,如果重啟,設定會失效)
[root@desktop ~]# echo $PATH //檢視環境變數
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@desktop ~]# ls /mnt/*
/mnt/file /mnt/install_apache.sh /mnt/passwd
[root@desktop ~]# chmod +x /mnt/*
[root@desktop ~]# install_apache.sh 11 //不能執行
bash: install_apache.sh: command not found...
[root@desktop ~]# PATH=$PATH:/mnt //修改路徑
[root@desktop ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/mnt
[root@desktop ~]# install_apache.sh 12 //可以執行
the Listen is changed
[root@desktop ~]# exit //退出連線
logout
Connection to 172.25.254.169 closed.
[kiosk@foundation69 Desktop]$ ssh [email protected]172.25.254.169 -X //重新連線
[email protected]172.25.254.169's password:
Last login: Sun Jun 17 04:52:04 2018 from 172.25.254.69
[[email protected] ~]# chmod +x /mnt/*
[[email protected] ~]# install_apache.sh //不能執行
bash: install_apache.sh: command not found...
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
########環境變數的設定方式
“”是弱引用,批量轉譯,不能轉義”!”,”\”,”`”,”$”
\代表單個字元,相當於”
”是強引用,批量轉譯
$()變數宣告,和“沒有區別
$[]等同於(())
${}系統宣告
echo 1+1 顯示結果為1+1,其中1+1是可變長字元
echo $[1+1] 顯示結果為2,是整形字元
###########變數值傳遞
$0 指令碼的名字
$1 指令碼後的第一串字串
$2 指令碼後的第二串字串
$3 指令碼後的第三串字串
$# 指令碼後所跟字元的個數
$* 指令碼後跟的所有字串,模式如“1 2 3 ……”
[email protected] 指令碼後跟的所有字串,模式如“1” “2” “3” ……
- 1
- 2
- 3
- 4
- 5
- 6
- 7
eg:vim file.sh
eg: $*和[email protected]的區別(指令碼示例):
[[email protected] ~]# vim for.sh
#!/bin/bash
for name in "[email protected]"
do
echo "$name"
done
[[email protected] ~]# sh -x for.sh
- 1
- 2
- 3
- 4
- 5
- 6
- 7
[[email protected] ~]# vim for.sh
#!/bin/bash
for name in "$*"
do
echo "$name"
done
[[email protected] ~]# sh -x for.sh
- 1
- 2
- 3
- 4
- 5
- 6
- 7
##########read互動式傳參
read -s NAME //-s 表示加密,輸入的時候看不到輸入的字元
read -p “input:” NAME //-p 列印
#!/bin/bash
read -p "please input a number:" -s IP(-p 後跟提示內容 -s 表示不顯示輸入的內容)
echo " "
ping -c1 -w1 $IP &> /dev/null && echo $IP is up || echo $IP is down
eg:互動式設定使用者檔案和密碼檔案建立使用者。
vim /mnt/create_user.sh
#!/bin/bash
read -p "please input userfile:" USERFILE
[ ! -e $USERFILE ]&&{
echo "\033[32mERROR:$USERFILE is not exist!!\033[0m"
exit 1
}
read -p "please input passfile:" PASSFILE
[ ! -e $PASSFILE ]&&{
echo "\033[32mERROR:$PASSFILE is not exist!!\033[0m"
exit 1
}
MAX_LINE=`awk 'BEGIN{N=0}{N++}{print N}' $USERFILE` //利用資料報告生成器計算userfile的行數;
for NUM in `seq 1 $MAX_Line` //變數NUM從1迴圈到最大值
do
USERNAME=`sed -n ${NUM}p $USERFILE` //利用sed對檔案userfle進行逐行提取
PASSWORD=`sed -n ${NUM}p $PASSFILE`
useradd $USERNAME //建立使用者
echo $PASSWORD | passwd --stdin $USERNAME //修改密碼
done
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
###########命令別名的設定
alias xie='vim' shell 環境變數
vim .bashrc
alias xie='vim' 使用者變數
source .bashrc
vim /etc/bashrc
alias xie='vim' 系統變數
source /etc/bashrc
刪除檔案中寫的內容
unalias xie 撤銷別名
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
1)臨時設定:
alias xie=’vim’ //設定vim的別名,即輸入xie即可開啟vim的功能
如果exit斷開連線,那麼臨時設定失效,下次登陸,xie命令不能識別;
2)永久生效:
(使用者級)
vim ~/.bashrc
alias xie=’vim’
source ~/.bashrc //重新整理
alias //檢視,是否有設定的別名;
但是,這種是在root的家目錄下設定的,只對root使用者生效;如果切換至student使用者,那麼xie命令不能識別;
(系統級)
vim /etc/bashrc
alias xie='vim'
source /etc/bashrc
alias
- 1
- 2
- 3
- 4
這種方式,是在系統的配置檔案修改的,對所有可以登陸系統的使用者都生效;如,切換至student使用者,xie命令也是生效的;
3)unalias xie; //撤銷命令的別名:
因為雖然把檔案資訊刪除之後,記憶體中還會存在別名設定的資訊,所以重新整理之後還會有alias xie存在;
#######利用命令執行結果設定變數
$? 是命令在執行完之後產生的退出值,範圍為[0-255]
當$0=0,時表示命令執行沒有錯誤輸出,這個值可以用ecit 命令執行。
echo $? //檢視退出值(0-255)
0 正確
1 命令執行的錯誤
2 方法不正確
示例 1:
利用echo $?返回退出值來判斷是否ip 可以ping通;
[[email protected] mnt]# vim /mnt/ip_check.sh
#!/bin/bash
ping -c1 -w1 $1 &> /dev/dull
NUM=`echo $?`
[ "$NUM" == "0" ]&&{
echo " $1 is up! "
exit 1
}||{
echo " $1 is down!"
exit 1
}
[[email protected] mnt]# sh /mnt/ip_check.sh 172.25.254.74
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 112
- 3
- 4
- 5
- 6
- 7
- 8
######################2.函式##########################################
函式的優點:
1)迴圈執行;
2)簡化指令碼內容;
3)可讀性更高;
示例 1:
要求:執行腳本回車,提示動作,輸入add,建立使用者,回車,輸入密碼;輸入del,刪除使用者;如果輸入exit;退出;
vim /mnt/create_user.sh
#!/bin/bash
ACTION_ADD()
{
[ "$1" == add ] && {
read -p "please input a username: " USERNAME
read -p "please input a password: " -s PASSWORD
useradd $USERNAME
echo -e "\033[31mthe users has created successfully!\033[0m"
echo $PASSWORD | passwd --stdin $USERNAME
}
}
ACTION_DEL()
{
[ "$1" == del ] && {
read -p "please input a username: " USERNAME
userdel -r $USERNAME
echo -e "\033[31m the user has deleted!\033[0m"
}
}
USER_CTL()
{
read -p "please input action(add or del): " ACTION
[ "$ACTION" == exit ] && {
echo -e "\033[31mbye\033[0m"
exit 0
}
ACTION_ADD $ACTION
ACTION_DEL $ACTION
USER_CTL
}
USER_CTL
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
示例 2:
實現對主機ip的網路ping檢測迴圈不間斷,直至輸入exit才會退出;