Bash位置參數
有兩種簡單的方法可以將用戶輸入讀入bash中的變量。第一個方法是使用read提示用戶輸入(使用-p選項)並將其直接存儲到一個或多個變量。
交互式
read -p ‘Enter your first and last name: ’ FIRST LAST
-p表示顯示交互內容,如不顯示則在最後加-s(可用於密碼輸入不回顯)
[root@localhost ~]# read -p 'please give me a num: ' a
please give me a num: 2
[root@localhost ~]# echo $a
2
[root@localhost ~]# read -p 'please give me a num: ' -s a
please give me a num: [root@localhost ~]# echo $a
24
位置參數
另一個方法是使用位置參數來讀取傳遞給腳本的命令行參數或選項輸入。
指定的位置參數總數:$#
位置參數自身:$0、$1、$2、$3….
所有位置參數: $@、$*
退出狀態
Linux命令完成時,將返回退出狀態。成功完成程序時,將返回0的推出狀態。這被bash當作邏輯True值。非零退出狀態通常表示發生了錯誤,並且被bash當作邏輯False值。
例如:grep的退出狀態的含義:
0 – 在指定的文件中找到了模式
1 – 在指定的文件中未找到模式
>1 – 一些其他錯誤(無法打開文件、錯誤的搜索表達式等)
推出狀態的值被存儲在”?”中,可以使用以下命令查看:
echo $?
test條件判斷
test命令可用於評估bash腳本中的表達式。它評估其參數所指定的表達式,如果表達式
爲true,返回零退出狀態,如果表達式爲false,則返回非零退出狀態。
非零或零長度字符串運算符
{-n | -z}
-n表示不爲0
-z表示爲0
[root@localhost ~]# a=1
[root@localhost ~]# test -n "$a" ;echo $?
0
[root@localhost ~]# test -z "$a" ;echo $?
1
[root@localhost ~]# [ -n "$a" ]&& echo yes || echo no ##若a不爲0則顯示yes,否則顯示no
yes
[root@localhost ~]# [ -z "$a" ]&& echo yes || echo no ##若a爲0則顯示yes,否則顯示no
no
字符串比較運算符:= !=
[root@localhost ~]# a=1
[root@localhost ~]# b=2
[root@localhost ~]# [ "$a" = "$b" ]&& echo yes || echo no ##a=b則顯示yes,否則顯示no
no
[root@localhost ~]# b=1
[root@localhost ~]# [ "$a" = "$b" ]&& echo yes || echo no
yes
[root@localhost ~]# [ "$a" != "$b" ]&& echo yes || echo no
no
[root@localhost ~]# b=2
[root@localhost ~]# [ "$a" != "$b" ]&& echo yes || echo no
yes
[root@localhost ~]# [ ! "$a" = "$b" ]&& echo yes || echo no ##當!在條件語句前表示條件不成立,這裏表示若a=b不成立則顯示yes,否則顯示no
yes
數字比較運算符
-eq 等於(=)
-ne 不等於(!=)
-lt 小於
-le 小於等於
-gt 大於
-ge 大於等於
[root@localhost ~]# a=1
[root@localhost ~]# b=4
[root@localhost ~]# [ "$a" -eq "$b" ]&& echo yes || echo no
no
[root@localhost ~]# b=1
[root@localhost ~]# [ "$a" -eq "$b" ]&& echo yes || echo no
yes
[root@localhost ~]# b=2
[root@localhost ~]# [ "$a" -ne "$b" ]&& echo yes || echo no
yes
[root@localhost ~]# [ "$a" -lt "$b" ]&& echo yes || echo no
yes
[root@localhost ~]# [ "$a" -gt "$b" ]&& echo yes || echo no
no
文件狀態運算符
-b 塊文件
-c 字符文件
-e 文件存在
-f 常規文件
-d 目錄
-r 可讀文件
-w 可寫
-x 可操作
-s 大小不爲0的文件
-S 套接字文件
-L 鏈接文件
二進制文件運算符
file1 -ef file2文件在同一個端口或設備
**file1 -nt file2**file1比file2新
**file1 -ot file2**file1比file2舊
邏輯運算符
-o or或者
-a and和
! 非
&& 正確則
|| 錯誤則
if語句
if命令檢查if後面的命令或列表的退出值。如果第一個命令評估爲true/零,則運行then之後的命令列表,直至任一else。如果第一個命令評估爲false/非零,則運行else與fi之間的命令列表(反向平寫if,標記if塊的結束)。
語法:
(1)
if command; then command; command2; else command3; fi
(2)
if command; then command; elif command2;then commend3; else command4; fi
例:
#!/bin/bash
read -p "please input your num: " a
if [ -z "$a" ]
then
echo no a
elif [ "$a" = "1" ]
then
echo hello world $a
else
echo i have no idea
fi
測試:
case語句
case語句 :它能夠把變量的內容與多個模板進行匹配,再根據成功匹配的模板去決定應該執行哪
部分代碼。
case .. in
..) ##條件1
;;
..) ##條件2
;;
esac ##結束點
例:
#!/bin/bash
case $1 in
start)
systemctl start firewalld
;;
stop)
systemctl stop firewalld
;;
esac
expect語句
在shell中利用expect實現自動應答腳本。
例:
利用自動應答腳本實現ssh自動連接
#!/usr/bin/expect
這一行告訴操作系統腳本里的代碼使用那一個shell來執行。
spawn是expect的內部命令,作用是給後面的shell指令加個殼,用來傳遞交互指令
expect eof
作用是在輸出中搜索文件結束符,如果沒有這一行,腳本會立即退出,得不到正確結果。
interact
執行完成後保持交互狀態,把控制權交給控制檯,這個時候就可以手工操作了。否則退出登錄。
$argv 參數數組
expect腳本可以接受從bash傳遞過來的參數.可以使用[lindex $argv n]獲得,n從0開始,分別表示第
一個,第二個,第三個….參數。
#!/usr/bin/expect
set IP [ lindex $argv 0] ##定義命令後的輸入的第一個字符爲IP
set PASS [ lindex $argv 1] ##定義命令後的輸入的第二個字符爲PASS
spawn ssh root@$IP
expect {
"yes/no" {send "yes\r";exp_continue}
"password:" {send "$PASS\r"}
}
interact
測試:
環境變量
shell和腳本使用變量來存儲數據 ,有些變量可以連同它們的內容傳遞給子進程,這些
變量我們稱之爲環境變量。
使用env命令顯示所有環境變量
使用set命令現實所有本地定義的shell變量
系統環境變量文件/etc/profile
用戶環境變量文件~/.bash_profile
Bash啓動腳本
(1)修改系統環境變量__用於系統
(2)修改用戶環境變量——僅用於本用戶
(3)當系統環境變量和用戶環境變量設定不一樣時,按最後讀取的環境變量即用戶環境變量。
使用別名
alias命令可以用來自定義屬於自己的系統命令,寫入~/.bashrc 文件永久生效
(1)添加別名
(2)刪除別名
刪除文件中的別名
unalias 別名
使用函數
函數名 () {
commends
}
腳本示例
check_ip主機檢測
存在則顯示丿,否則顯示down
且沒有給出ip時會提示
#!/bin/bash
while [ "$#" -eq "0" ]
do
echo "please input a IP address!!!"
exit 1
done
ping -c1 $1 &>/dev/null && echo "the $1 is up" || echo "the $1 is down"
測試:
check_ip.sh主機檢測
check_ip主機檢測的另一種實現
#!/bin/bash
[ -n "$1" ]&& (
ping -c1 -w1 $1 &> /dev/null && echo "$1 is up " || echo "$1 is down")||(echo "please give me a address!")
測試:
ip_check本機地址的查看
實現可以查看本地的ip地址,且會顯示可查看的設備
awk ‘{print $1}‘ 表示取出輸入的第一串字符
-F : 表示不取出:符號
#!/bin/bash
echo "you can input these interface: "
ifconfig | grep flags | awk -F: '{print $1}'
read -p "please give me a interface: " a
ifconfig $a | grep netmask | awk '{print $2}'
測試:
check_file.sh檢測文件的類型
實現可以檢測文件的類型
#!/bin/bash
while [ -z "$*" ]
do
echo "please give me a file or directory"
exit 0
done
if [ -e "$1" ]
then
while [ -b "$1" ]
do
echo "It's a block file "
exit 1
done
while [ -c "$1" ]
do
echo "It's a character file "
exit 1
done
while [ -d "$1" ]
do
echo "It's a directory "
exit 1
done
while [ -S "$1" ]
do
echo "It's a socket file "
exit 1
done
while [ -L "$1" ]
do
echo "It's a link file "
exit 1
done
while [ -f "$1" -a ! -L "$1" ]
do
echo "It's a file "
exit 1
done
while [ -x "$1" ]
do
echo "the file can be exced "
exit 1
done
else
echo "It's not exists"
exit 1
fi
測試:
用戶建立
(1)create_user.sh
建立用戶並設置密碼爲westos
已建立的用戶提示已存在
#!/bin/bash
if [ -z "$*" ]
then
echo "please give me a user file"
elif [ ! -e "$*" ]
then
echo "$1 is not exist"
else
for USER in `cat $1`
do
id $USER &> /dev/null && (
echo "$USER is exist,$USER's passwd is changing"
echo westos | passwd --stdin $USER &> /dev/null) || (
useradd $USER
echo westos | passwd --stdin $USER &> /dev/null
echo "$USER is creating")
done
fi
測試:
(2)ctrl_user.sh
完善create_user.sh,使可以提示沒有文件時的情況,可以批量刪除用戶
#!/bin/bash
if [ "$1" = "create" ]
then
if [ -z "$2" ]
then
echo "please give me a user file"
elif [ ! -e "$2" ]
then
echo "$2 is not exist"
else
for USER in `cat $2`
do
id $USER &> /dev/null && (
echo "$USER is exist"
echo westos | passwd --stdin $USER &> /dev/null) || (
useradd $USER
echo westos | passwd --stdin $USER &> /dev/null)
done
fi
elif [ "$1" = "delete" ]
then
if [ -z "$2" ]
then
echo "please give me a user file"
elif [ ! -e "$2" ]
then
echo "$2 is not exist"
else
for USER in `cat $2`
do
userdel -r $USER &> /dev/null
echo "$USER is not exist "
done
fi
else
echo "USAGE: /mnt/ctrl_user.sh [ create|delete ] userfile "
fi
測試:
(3)ctrl_user
ctrl_user.sh的利用函數實現的另一種方式
#!/bin/bash
ACTION () {
if [ -z "$4" ]
then
echo "please give me a user file"
elif [ ! -e "$4" ]
then
echo "$4 is not exist"
else
for NAME in `cat $4`
do
USER=`getent passwd $NAME`
if [ $1 "$USER" ]
then
$2 $NAME
[ "$2" = "useradd" ]&&(echo westos | passwd --stdin $NAME &> /dev/null)
else
echo "$NAME is exist"
fi
done
fi
}
if [ "$1" = "create" ]
then
ACTION -z "useradd" "exist" $2
elif [ "$1" = "delete" ]
then
ACTION -n 'userdel -r' 'not exist' $2
else
echo "USAGE: /mnt/ctrl_user.sh [ create|delete ] userfile "
fi
測試:
check_num.sh比較兩個數的和是否大於10
#!/bin/bash
while [ -z "$1" -o -z "$2" ]
do
echo "please give me two number"
exit 1
done
let A=$1+$2
[ "$A" -le "10" ] && echo "$1+$2's sum is equal or lesser than 10,and the sum is $A" || echo "$1+$2's sum is larger than 10"
測試: