目录
知识点1:shell概述
既是一种应用程序,又是一种程序设计语言,解释语言
shell是用户和Linux内核之间的接口程序
知识点2:shell的三种执行方式
如果是没有可执行权限
chmod +x 01_shell.sh
1、 ./01_shell.sh //子shell里执行,#!指定的解析器解析,如果没指定,使用系统默认
2、. 01_shell.sh //当前shell里执行,#!指定的解析器解析和系统默认不同,采用系统默认的解析器
3、bash 01_shell.sh //子shell里执行,bash解析器优先级高于#!后指定的解析器
知识点3:运行shell脚本文件问题解决
安装 dos2unix
sudo apt install dos2unix
1、使用dos2unix转换文件格式
dos2unix XX_SHELL.sh
2、用vim打开文件,在命令行模式下:
set ff=unix
知识点4:shell脚本分类
1、配置文件/etc/profile,所有用户有效
2、~/.bashrc ,当前用户有效
知识点5:shell变量
1、定义变量
变量名=变量值
引用变量
$变量
2、案例1:
#!/bin/bash
num=100
echo "num=$num"
3、清除变量
使用unset命令清除变量
unset varname
#!/bin/bash
num=100
echo "num=$num"
unset num
echo "num=$num"
4、只读变量
#!/bin/bash
readonly num=100
echo "num=$num"
num=1000
echo "num=$num"
5、从键盘获得输入
read string:从键盘输入一个字符串付给变量string
#!/bin/bash
read -p "请输入数据:" data
echo "data=$data"
6、环境变量
查看系统环境变量:env
export var=300
使用export说明的变量,会被导出为环境变量,其它shell均可使用
7、注意事项
变量名只能包含英文字母下划线,不能以数字开头,定义变量时“=”两边不能有空格
#!/bin/bash
export DATA=1000
通过env也能查看到设置的环境变量
env>a.txt
知识点5:预设变量
- $#:传给shell脚本参数的数量
- $*:传给shell脚本参数的内容
- $1、$2、$3、...、$9:运行脚本时传递给其的参数,用空格隔开
- $?:命令执行后返回的状态
- "$?"用于检查上一个命令执行是否正确(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错)。
- $0:当前执行的进程名
- $$:当前进程的进程号
- "$$"变量最常见的用途是用作临时文件的名字以保证临时文件不会重复
预设变量案例
#!/bin/bash
echo "参数个数:$#"
echo "参数内容:$*"
echo "参数1:$1"
echo "参数2:$2"
echo "参数3:$3"
echo "参数4:$4"
echo "进程名:$0"
echo "进程号:$$"
read data
知识点6:脚本变量的特殊用法
- ""(双引号):包含的变量会被解释
- ''(单引号):包含的变量会当做字符串解释
- ``(数字键1左面的反引号):反引号中的内容作为系统命令,并执行其内容,可以替换输出为一个变量
- \ 转义字符:同c语言 \n \t \r \a等 echo命令需加-e转义
- (命令序列):由子shell来完成,不影响当前shell中的变量
- { 命令序列 }:在当前shell中执行,会影响当前变量
脚本变量案例
#指定解析器
#!/bin/bash
#查看当前目录下的文件
#echo "当前目录下有哪些文件:`ls -a`"
#查看当前进程
echo "当前进程:`ps -a`"
转义字符案例
#!/bin/bash
echo -e "1234354545\tbcded"
echo -e "########\n#########"
()和{}的区别
#!/bin/bash
num=100
(
#子shell num=500 echo "()内的num=$num"
)
echo "()外的num=$num"
{
num=1000 echo "{}内的num=$num"
}
echo "{}外的num=$num"
知识点7:条件测试语句
test condition 或[ condition ]
1、文件测试
-e 是否存在 -d 是目录 -f 是文件
-r 可读 -w 可写 -x 可执行
-L 符号连接 -c 是否字符设备 -b是否块设备
-s 文件非空
#!/bin/bash
read -p "请输入文件名:" filename
test -e $filename
#条件表达式1
echo "$?"
[ -d $filename ]
#条件表达式2
echo "$?"
2、字符串测试
test str_operator “str”
test “str1” str_operator “str2”
[ str_operator “str” ]
[ “str1” str_operator “str2”]
其中str_operator可以是:
= 两个字符串相等 != 两个字符串不相等
-z 空串 -n 非空串
#!/bin/bash
read -p "请输入字串1: " str1
read -p "请输入字串2: " str2
test -z $str1 #空串
echo "$?"
test -n $str2 #非空
echo "$?"
[ $str1 = $str2 ] #串1和串2相等
echo "$?"
[ $str1 != $str2 ] #串1和串2相等
echo "$?"
3、数字测试
测试数值格式如下:
test num1 num_operator num2
[ num1 num_operator num2 ]
num_operator可以是:
-eq 数值相等
-ne 数值不相等
-gt 数1大于数2
-ge 数1大于等于数2
-le 数1小于等于数2
-lt 数1小于数2
#!/bin/bash
read -p "请输入数字1: " num1
read -p "请输入数字2: " num2
[ $num1 -gt $num2 ]
echo "$?"
[ $num1 -le $num2 ]
echo "$?"
4、复合测试
命令执行控制:
&&:
command1 && command2
&&左边命令(command1)执行成功(即返回0)shell才执行&&右边的命令(command2)
||
command1 || command2
||左边的命令(command1)未执行成功(即返回非0)shell才执行||右边的命令(command2)
#!/bin/bash
read -p "请输入数字(50~100): " num
[ $num -ge 50 -a $num -le 100 ]
echo "$?"
read -p "请输入文件: " file
[ -d $file -o -e $file ]
echo "$?"
知识点8:控制语句
1、if控制语句
格式一:
if [条件1]; then
执行第一段程序
else
执行第二段程序
fi
格式二:
if [条件1]; then
执行第一段程序
elif [条件2];then
执行第二段程序
else
执行第三段程序
fi
#!/bin/bash
read -p "请输入一个分数: " num
if [ $num -ge 60 -a $num -lt 80 ];then
echo "合格"
elif [ $num -ge 80 -a $num -lt 90 ];then
echo "良好"
elif [ $num -ge 90 -a $num -le 100 ];then
echo "优秀"
else
echo "不合格"
fi
2、case 控制语句
case 控制语句格式
case $变量名称 in
“第一个变量内容”) 程序段一
;; //break
“第二个变量内容”) 程序段二
;; //brak;
*) //default
其它程序段
exit 1
esac
#!/bin/bash
read -p "请输入一个分数(10分制) " num
case $num in
0|1|2|3|4|5)
echo "不合格"
;;
6)
echo "合格"
;;
7|8)
echo "良好"
;;
9|10)
echo "优秀"
;;
*)
echo "无效分数"
exit 1
esac
3、for 控制语句
形式一:
for (( 初始值; 限制值; 执行步阶 ))
do
程序段
done
形式二:
for var in con1 con2 con3 ...
do
程序段
done
4、declare
是bash的一个内建命令,可以用来声明shell变量、设置变量的属性。declare也可以写作typeset。
declare -i s 代表强制把s变量当做int型参数运算。
#!/bin/bash
declare -i i
declare -i sum
for ((i=0;i<=100;i++))
do
sum=$sum+$i;
done
echo "sum=$sum"
扫描文件夹下的所有文件
#!/bin/bash
for file in `ls`
do
echo "$file"
done
5、while控制语句
while [ condition ]
do
程序段
done
#!/bin/bash
declare -i i=0
declare -i sum=0
while [ $i -le 100 ]
do
sum=$sum+$i
i=$i+1
done
echo "sum=$sum"
6、unitl控制语句
until [ condition ]
do
程序段
done
这种方式与while恰恰相反,当condition成立的时候退出循环,否则继续循环。
#!/bin/bash
declare -i i=0
declare -i sum=0
until [ $i -gt 100 ]
do
sum=$sum+$i
i=$i+1
done
echo "sum=$sum"
7、break & continue
- break:
- 命令允许跳出循环。
- break 通常在进行一些处理后退出循环或case 语句
- continue:
- continue 命令类似于break 命令
- 只有一点重要差别,它不会跳出循环,只是跳过这个循环步骤
break案例
#!/bin/bash
declare -i i=0
declare -i sum=0
while [ $i -le 100 ]
do
if [ $i -eq 50 ];then
break
fi
sum=$sum+$i
i=$i+1
done
echo "sum=$sum"
continue案例
#!/bin/bash
declare -i i=0
declare -i sum=0
while [ $i -lt 100 ]
do
i=$i+1
if [ $i -eq 50 ];then
continue
fi
sum=$sum+$i
done
echo "sum=$sum"
知识点9:函数
格式一:
函数名() { 命令 ... }
格式二:
function 函数名() { 命令 ... }
1、同一个文件函数调用
#!/bin/bash #函数的定义
declare -i sum=0 #将变量sum强制转换成整型
function my_add() {
sum=$1+$2
echo "sum=$sum"
} #函数的调用
my_add 10 20
2、不同文件函数调用
19_shell.sh (函数定义)
#!/bin/bash #函数的定义 declare -i sum=0 #将变量sum强制转换成整型 function my_add() { sum=$1+$2 echo "sum=$sum" }
20_shell.sh(函数调用)
#!/bin/bash
source 19_shell.sh #函数的调用
my_add 50 50
3、函数调用值返回
函数调用:
#!/bin/bash
source 19_shell.sh #函数的调用
my_add 50 50
echo "sum=$?"
函数定义:
#!/bin/bash #函数的定义
declare -i sum=0 #将变量sum强制转换成整型
function my_add() {
sum=$1+$2
#echo "sum=$sum"
return $sum
}