本文为作者(石岩)原创,转载请指明出处:
juejin.cn/post/684490…
第一个Shell脚本
案例:输出Hello Shell
#!/bin/bash
echo "Hello Shell"
运行Shell脚本的两种方法
1.作为可执行程序
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
2.作为解释器参数
sh test.sh
变量
双引号
变量值中如果存在$变量名的话,输出结果将会是变量名对应的变量值。
单引号
如果变量值中存在$变量名的话,那么将原样输出。
反单引号
存在的是命令
案例:使用shell脚本,输出当前所在的目录
#!/bin/bash
dir=`pwd`
echo "$dir"
案例:计算/etc目录下有多少个文件,用shell脚本实现
#!/bin/bash
cd /etc
filenumber=`ls -l|wc -l`
echo "该目录下有$filenumber个文件"
案例:实现统计任何指定目录下的文件个数
#!/bin/bash
read -p "请输入目录:" dir
cd $dir
filenumber=`ls -l|wc -l`
echo "该目录下有$filenumber个文件"
数组
语法
array_name=(value1 ... valuen)
#!/bin/bash
array=(1 2 3 4 5)
result=${array[2]}
count=${#array[*]}
echo "下标为2的元素:$result"
echo "数组的个数:$count"
参数传递
$1:表示第一个参数
$2:表示第二个参数
$3:表示第三个参数
$n:表示第n个参数
$0:表示文件名
$@:显示全部参数
$#:显示参数的个数
重定向
把命令的内容输出到文件中
命令 说明
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。
正确的命令 1表示
覆盖 命令 1>文件名 例:ls 1>a.txt
追加 命令 1>>文件名 例:ls 1>>a.txt
错误的命令 2表示
覆盖 命令 2>文件名 例:ls 2>a.txt
追加 命令 2>>文件名 例:ls 2>>a.txt
注意: 0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)
如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:
$ command > file 2>&1
/dev/null 文件
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
$ command > /dev/null
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
如果希望屏蔽 stdout 和 stderr,可以这样写:
$ command > /dev/null 2>&1
if...else分支
#语法
if[ 条件 ]
then
语句
else
语句
fi
案例:判断 /Users目录是否为空
#!/bin/bash
dir=`ls /Users`
if [ "$dir" == "" ]
then
echo "目录为空"
else
echo "目录不为空"
fi
逻辑运算符
且:-a
或者:-o
非:!
案例:判断用户输入的用户名和密码是否为admin 123456,如果是则提示登录成功,否则提示失败
#!/bin/bash
read -p "请输入用户名和密码:" username password
if [ "$username" == 'admin' -a "$password" == '123456' ]
then
echo "正确"
else
echo "错误"
fi
比较运算符
-eq 判断是否相等
-ne 判断是否不相等
-gt 判断是否大于
-ge 判断是否大于等于
-lt 判断是否小于
-le 判断是否小于等于
案例:判断学生的成绩,大于90-100提示优秀,80-90之间提示良好,70-80之间则提示一般,60-70之间提示及格。其他则提示不及格
#!/bin/bash
read -p "请输入你的分数:" score
if [ "$score" -ge 90 -a "$score" -le 100 ]
then
echo "优秀"
elif [ "$score" -ge 80 -a "$score" -lt 90 ]
then
echo "良好"
elif [ "$score" -ge 70 -a "$score" -lt 80 ]
then
echo "一般"
elif [ "$score" -ge 60 -a "$score" -lt 70 ]
then
echo "及格"
else
echo "不及格"
fi
文件判断
-r -r filename 文件是否存在且可读
-w -w filename 文件是否存在且可写
-x -x filename 文件是否存在且可执行
-f -f filename 文件是否存在且是普通文件
-d -d filename 文件是否存在且是一个目录
-e -e filename 文件是否存在
-n -n str1 字符串长度是否不等于0
-z -z str2 字符串长度是否等于0
case分支
语法
case $变量名 in
"值")
语句;;
"值")
语句;;
esac
案例:输入一个序号,判断该用户选择哪款产品,A:笔记本 B:电饭煲 C:小台灯
#!/bin/bash
read -p "请输入购买的产品:" pro
case $pro in
"A")
echo "笔记本";;
"B")
echo "电饭煲";;
"C")
echo "小台灯";;
esac
案例:请输入对客服的满意度,【0-3】不满意,【4-6】满意,【7-9】非常满意
#!/bin/bash
read -p "请输入对客服的满意度:" pj
case $pj in
[0-3])
echo "不满意";;
[4-6])
echo "满意";;
[7-9])
echo "非常满意";;
esac
for循环
#语法
for 变量名 in 列表
do
语句
done
案例:输出1-10之间的数
#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
echo "$i"
done
改进版
#!/bin/bas
for i in `seq 1 1 10`
do
echo "$i"
done
while循环
#语法
while [ 条件 ]
do
命令
done
案例:求1到100之间的和
#!/bin/bash
i=1
sum=0
while [ "$i" -le 100 ]
do
sum=$(($sum+$i))
((i++))
done
echo $sum
函数
#语法
函数名(){
}
函数返回值:函数正确时返回0,函数错误时返回1。
查看返回值内容:$?
案例:定义一个函数,打印出Hello World
#!/bin/bash
hello(){
echo "Hello World"
}
hello
案例:输入2个数字,求和。
#!/bin/bash
read -p "请输入第一个数字:" one
read -p "请输入第二个数字:" two
add(){
result=$(($1+$2))
echo "$result"
}
add $one $two
函数参数
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
输出结果:
第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !
注意,$10不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。