自己没事总结了点基础的东西,以备不时之需。
一.判断式:
1.判断符号 &&及||
检测test是否存在:
# test -e /haha
注:test是一个判断文件属性的命令,-e参数判断目录是否存在,执行结果不会显示任何信息,但最后我们可以透过$?或&&及||来展现整个结果
例如:
# test -e /haha && echo "exist" ||echo "not exist"
注: -f参数判断是否为文件,-d判断是否为目录
实例:
1).让使用者输入一个文件名,判断这个文件名是否存在,若不存在给予一个filename does not exist的信息,并中断程序。
2).若这个文档存在,则判断他是文档还是目录,结果输出filename is regular file 或 filename is directory
3).判断执行者对这个文件或目录所拥有权限,并输出权限目录:
# vi sh05.sh
--------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
# 判断是否输入字符串:
echo -e "Please input a filename,I will check the filename's type and permission. \n\n"
read -p "Input afilename:"filename
test -z $filename && echo "You must input a filename." && exit 0
# 判断文件是否存在,若不存在则提示并退出
test ! -e $filename && echo "The filename `$filename` do not exist" && exit 0
# 判断文件类型和属性:
test -f $filename && filetype="regulare file"
test -d $filename && filetype="directory"
test -r $filename && perm="readable"
test -w $filename && perm="$perm writable"
test -x $filename && perm="$perm executable"
# 输出信息:
echo "The filename:$filename is a $filetype"
echo "And the permissions are:$perm"
--------------------
2.判断符号[]
判断$HOME变量是否为空:
# [ -z "$HOME" ];echo $?
注: 中括号因为用在很多包括通配符,正则表达式中,所以用在shell判别式时,为了与其他用法区分,必须在括号两端用"空格"间隔。
判断两个变量是否相同
# [ "$HOME" == "$MAIL" ]
实例
1.当执行一个程序时,程序会让用户选择Y或N
2.如果用户输入Y或y时,就显示OK continue
3.如果用户输入n或N时,显示oh,interrupt!
4.如果输入其他字符,就显示 I don't know what fucking your choice is
利用[] && ||实现
# vi sh06.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Please input (Y/N):" yn
["$yn" == "Y" -o "$yn" == "y" ] && echo "OK,continue" && exit 0
["$yn" == "N" -o "$yn" == "n" ] && echo "oh,interrupt!" && exit 0
echo "I don't know what fucking your choice is" && exit 0
----------------------
传参:
实例:
1.程序文件名为何?
2.共有几个参数?
3.若参数个数小雨2则告知使用者参数数量太少
4.全部的参数为何?
5.第一个参数为何?
6.第二个参数为何?
# vi sh07.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo "The script name is ==> $0"
echo "Total parameter number is ==> $#"
[ "$#" -lt 2 ] && echo "The number of parameter is less than 2. Stop here." && exit 0
echo "Your whole parameter is ==> $@"
echo "The 1st parameter ==> $1"
echo "The 2st parameter ==> $2"
----------------------
条件判断:
利用if...then
sh06修改版:
# vi sh08.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Please input (Y/N):" yn
if [ "$yn" == "Y" ] || [ "$yn" == "y" ];then
echo "OK,continue"
exit 0
elif [ "$yn" == "N" ] || [ "$yn" == "n" ]; then
echo "oh,interrupt!"
exit 0
else
echo "I don't know what fucking your choice is"
exit 0
fi
fi
----------------------
实例1:
1.判断$1是否为hello,如果是,显示 hello,how are you?
2.如果没加参数,提示用户必须使用参数
3.如果加入的参数不是hello,就提示用户只能用hello作为参数
# vi sh09.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
if [ "$1" == "hello" ];then
echo "Hello,how are you?"
elif [ "$1" == "" ];then
echo "You must input parameters,example:{$0 someword}"
else
echo "The only parameter is 'hello',example:{$0 hello}"
fi
---------------------
实例2:
判断主机常见21,22,25,80是否开启
# vi sh10.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
PORT=$(netstat -tunl |grep "$1"| sed -n '1p' | awk '{print $4}'| sed 's/^.*://g')
VAR=$(echo "$1" |bc 2>/dev/null)
if [ "$1" == "" ]; then
echo "Please input a port.example:{sh $0 80}"
elif [ "$VAR" != "$1" ];then
echo "Please input the right port.example:{sh $0 80}"
elif [ "$PORT" == "21" ];then
echo "ftp is running in your system"
elif [ "$PORT" == "22" ];then
echo "ssh is running in your system"
elif [ "$PORT" == "25" ];then
echo "smtp is running in your system"
elif [ "$PORT" == "80" ];then
echo "www is running in your system"
else
echo "the port:$1 is not running"
fi
----------------------
利用if...esac判断
sh09修改版:
# vi sh11.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
case $1 in
"hello")
echo "Hello,how are you?"
;;
"")
echo "You must input parameters,example:{sh $0 someword}"
;;
*)
echo "Usage:{sh $0 hello}"
;;
esac
---------------------
实例2:
# vi sh12.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
case $1 in
"one")
echo "Your choice is ONE"
;;
"two")
echo "Your choice is TWO"
;;
"three")
echo "Your choice is "THREE"
;;
*)
echo "Usage $0 {one|two|three}"
esac
---------------------
function功能
实例1:
# vi sh13.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
function printit(){
echo -n "Your choice is" # -n表示不断行在同行显示
}
echo "This program will print your selection!"
case $1 in
"one")
printit;echo $1 | tr 'a-z' 'A-Z' # 将参数做大小写转换
;;
"two")
printit;echo $1 | tr 'a-z' 'A-Z'
;;
"three")
printit;echo $1 | tr 'a-z' 'A-Z'
;;
*)
echo "Usage $0 {one|two|three}"
;;
esac
--------------------------
实例1变种:
# vi sh14.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
function printit(){
echo "Your choice is $1"
}
echo "This program will print your selection!"
case $1 in
"one")
printit 1 # printit 后可接参数
;;
"two")
printit 2
;;
"three")
printit 3
;;
*)
echo "Usage $0 {one|two|three}"
;;
esac
--------------------------
while do done,until do done(不定循环)
# vi sh15.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
while [ "$yn" != "yes" -a "$yn" != "YES" ]
do
read -p "Please input yes/YES to stop this program:" yn
done
echo "OK,you input the correct answer."
----------------------
# vi sh16.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
until [ "$yn" == "yes" -o "$yn" == "YES" ]
do
read -p "Please input yes/YES to stop this program:" yn
done
echo "OK,you input the correct answer."
----------------------
计算1+2+...+100=?
# vi sh17.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
s=0
i=0
while [ "$i" != "100" ]
do
i=$($i+1)
s=$($s+$i)
done
echo "The result of '1+2+3+...+100'=" $s
-----------------------
for...do...done (固定循环)
# vi sh18.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
for animal in dog cat elephant
do
echo "There are ${animal}s..."
done
---------------------
# vi sh19.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
users=$(cat /etc/passwd | awk 'BEGIN {FS=":"} {print $1}')
for username in $users
do
id $username
# finger $username
done
---------------------
实例1:
利用for循环ping网内主机状态
# vi sh20.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
network="172.24.30"
for host in $(seq 1 254)
do
ping -c 1 -w 1 ${network}.${host}&> /dev/null && result=1 || result=0
case "$result" in
"1")
echo "Server ${network}.${host} is UP."
;;
"0")
echo "Server ${network}.${host} is DOWN."
;;
esac
done
-----------------------
实例2:
让用户输入某个文件名,找出该目录内的文件名的权限
# vi sh21.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Please input a directory:" dir
if[ "$dir" == "" -o ! -d "$dir" ];then
echo "The $dir is NOT exist in your systemn."
exit 1
fi
filelist=$(ls $dir)
for filename in $filelist
do
perm=""
test -r "$dir/$filemane" && perm="$perm readable"
test -w "$dir/$filename" && perm="$perm writable"
test -x "$dir/$filename" && perm="$perm executable"
echo "The file $dir/$filename's permission is ${perm}."
done
-----------------------
# vi sh22.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Please input a number,I will count for 1+2+..+{your_input}:" nu
s=0
for((i=1;i<=$nu;i=i+1))
do
s=$(($s+$i))
done
echo "The result of '1+2+3+...+$nu' is ===> $s"
----------------------
debug
# sh -x sh22.sh
习题
建立一个script,当你执行script时,该script可以显示:
1.你目前的身份(whoami)
2.你锁在目录
# vi test01.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "Your name is $(whoami)"
echo -e "The current directory is $(pwd)"
---------------------
让用户输入一个数字,程序可以由1+2+3+....一直累加到用户输入的数字为止
# vi test02.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Please input a number,I will count for 1+2+...+{your_input}:" nu
s=0
for (( i=1;i<=$nu;i=i+1 ))
do
s=$(($s+$i))
done
echo "The answser of "1+2+...+$nu =" $s"
---------------------
写一个程序
1.先查看/root/test/logical这个文件是否存在
2.若不存在,则建立一个文档,使用touch建立,建立完成后离开
3.如果存在,判断是否为文件,若为文件则删除后建立一个目录,名为logical,之后离开
4.如果存在,则移除此目录
# vi test02.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
cd /root/test
if [ ! -e logical ];then
touch logical
echo "Just make a file logical"
exit 1
elif [ -e logical ]&&[ -f logical ];then
rm -rf logical && mkdir logical
echo "Just make a directory logical"
exit 1
elif [ -e logical ]&&[ -d logical ];then
rm -rf logical
echo "Just delete a directory logical"
exit 1
fi
-----------------------
写一个程序,将/etc/passwd的第一栏取出,而每一栏都以一行字符串[The 1 account is "root"]来显示,那个1表示行数。
# vi test04.sh
---------------------
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
var=$(cat /etc/passwd | awk 'BEGIN {FS=":"} {print $1}')
for account in $var
do
declare -i i=$i+1
echo "The $i account is $account"
done
---------------------
或
----------------------
#!/bin/bash
awk 'BEGIN {FS=":"} {printf "The %s account is %s\n",NR,$1}' /etc/passwd
----------------------
或
----------------------
#!/bin/bash
awk 'BEGIN {FS=":"} {print "The " NR " account is "$1}' /etc/passwd
----------------------