Shell基础总结

568 阅读2分钟

本文为作者(石岩)原创,转载请指明出处:
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}来获取参数。