文章目录
- 判断文件类型的脚本
- 判断符号[]
- 带参数脚本
- 条件判断
- i f if if判断式
- case...esac判断
- 循环
- w h i l e while while
- f o r for for
- function函数
- 一些简单的例子
- 判断网段下哪些主机是开着的
- 输入一个路径,判断该路径下所有文件的权限
判断文件类型的脚本
#!/bin/bash
echo -e "Please input a filename, I will check the filename's type and permission. \n\n"
read -p "Input a filename: " 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} writeale"
test -x ${filename} && perm="${perm} executable"
# 开始输出信息
echo "The filename: ${filename} is a ${filetype}"
echo "And th permissions for you are : ${perm}"
变量替换
关于echo -e
关于test命令
关于-a到-z的含义
判断符号[]
使用 t e s t test test来判断终究还是麻烦了点,比如如果想知道 H O M E \rm HOME HOME是否为空,只需要这样
[ -z "${HOME}" ]
括号旁边都带个空格,用法和test基本一样
其中echo $?是查看上一条命令是否执行成功,若成功返回 0 0 0
而 − z s t r i n g \rm -z\ string −z string表示 s t r i n g \rm string string长度为零时返回真
这里不为真,输出错误码 1 1 1
再比如判断两个变量是否相等
可以看到第一第二次表达式都是正确的,为什么第三次输出结果相反??
因为等于号旁边要加空格,不然等于号表示赋值而不是判断
带参数脚本
当文件名为par.sh时候,执行只需要输入文件名即可
但是我加上一下参数呢??比如我执行par.sh -a -t呢??
/path opt1 opt2 opt3.....
$0 $1 $2 $3
如上所示,$0,$1等都是自带的参数,默认就给你读取下来了
执行脚本的文件存在变量$0中,后面的$1,$2…都是参数
$#:代表本次读取到的参数个数
$@:表示["$1" “$2” “$3”]
比如一下是一个接收两个参数的脚本,并依次打印两个参数是什么
#!/bin/bash
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 "The 1st parameter==>${1}"
echo "The 2nd parameter==>${2}"
echo "\$@=$@"
echo "\$*=$*"
条件判断
i f if if判断式
判断一次
if [ 条件判断式 ]; then
当判断式为真,执行的代码
fi #结束if的意思
判断多次
if [ 条件判断式1 ]; then
当判断式一成立可执行的命令
elif [ 条件判断式2 ]; then
当判断式二成立可执行的命令
else
当上面的命令都不成立时执行的命令
fi
case…esac判断
和其他语言一样也有个 c a s e case case,基本语法大概是
case $变量名称 in
"第一个变量内容“)
程序段
;;
"第二个变量内容")
程序段
;;
*)
程序段
;;
esac
以下是一个简单的判断用户输入的脚本
#!/bin/bash
echo "This program will print your selection !"
read -p "input your choice: " choice
case ${choice} in
"one")
echo "Your choice is one"
;;
"two")
echo "Your choice is two"
;;
*)
echo "Usage ${0} {one|two}"
;;
esac
循环
w h i l e while while
while [ condition ]
do
程序段
done
只要 c o n d i t i o n condition condition条件成立就一直执行下去
f o r for for
for var in con1 con2 con3...
do
程序段
done
第一次循环 v a r = c o n 1 var=con1 var=con1,第二次循环 v a r = c o n 2 var=con2 var=con2…以此类推
for ((初始值;限制条件;赋值运算))
额,说的好难懂,其实和程序的 f o r for for循环没啥两样
看个例子就好了,比如用户输入一个 n n n,计算 ∑ i = 1 n i \sum\limits_{i=1}^ni i=1∑ni
#!/bin/bash
read -p "Please input a number, I will count for 1+2+...+your_input: " nu
sum1=0
for (( i=1; i<=${nu}; i=i+1 ))
do
sum1=$(($sum1+$i))
done
echo "for loop cal is $sum1"
declare -i sum2=$(($nu*($nu+1)/2))
echo "math plan cal is $sum2"
function函数
s h e l l shell shell里的代码从上至下执行,所以函数应该放在最开头
基本语法为
function fname(){
程序段
}
至于怎么传参数,和命令的使用规则是一样的
fname (变量1) (变量2)...
然后再 f n a m e fname fname函数内部,变量一自然就是$1了,注意函数内的$1不同于外部的$1.
一些简单的例子
判断网段下哪些主机是开着的
比如我虚拟机的网段是 192.168.10 192.168.10 192.168.10
我想看一下 192.168.10.1 − 192.168.10.100 192.168.10.1-192.168.10.100 192.168.10.1−192.168.10.100这 100 100 100个 i p ip ip能不能 p i n g ping ping通
#!/bin/bash
network="192.168.10."
for sitenu in {1..100} #{1..100}表示区间,也可以写作$(seq 1 100)
do
ping -c 1 -w 1 ${network}${sitenu} &> /dev/null && result=0 || result=1
#开始显示结果是否是正常的
if [ "${result}" == 0 ]; then
echo "Server ${network}${sitenu} is UP; "
else
echo "Server ${network}${sitenu} is DOWN; "
fi
done
相信这段代码比较难理解
ping -c 1 -w 1 ${network}${sitenu} &> /dev/null && result=0 || result=1
注意理解-c 1是 p i n g ping ping的选项,表示期望收到 1 1 1次回应就算成功
而-w 1也是 p i n g ping ping的选项,表示期限是 1 1 1秒,超过一秒就算失败
而&> /dev/null是把前面命令的输出信息重定向搭配 / d e v / n u l l /dev/null /dev/null去
后面的&& result=0 || result=1就是接收以下前面的一大串命令是否是成功的
输入一个路径,判断该路径下所有文件的权限
#!/bin/bash
read -p "Please input a directory: " dir
if [ "$dir" == "" ];then
echo "The ${dir} is NOT exist in your system."
exit 1
fi
# 开始正式测试文件
filelist=$( ls ${dir} )
for filename in ${filelist}
do
perm=""
test -r "${dir}/${filename}" && perm="${perm} readable"
test -w "${dir}/${filename}" && perm="${perm} write"
test -x "${dir}/${filename}" && perm="${perm} executable"
echo ${perm}
echo "The file ${dir}/${filename}'s permisson is ${perm}"
done
这个比较简单,就不解释了.