shell是一个命令行解释器,主要用于翻译用户操作,调用系统内核
是一个十分强大的编程语言
Linux对shell提供了下面这几个解析器(可去etc/shells中找到解析器列表)
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
shell脚本文件一般以.sh结尾
我们可以使用touch命令创建一个.sh文件
#!/bin/bash //指定解析器
//下面就可以编写命令
echo "hello,world"
1. sh或bash +需要执行的文件路径(不需要赋执行权限)
2. 直接输入文件路径(需要执行权限)
因为我们的执行界面本身就是一个bash,所以可以直接输入路径调用脚本,但是调用文件需要执行权限,所以我们需要对文件赋予执行权限。
3.路径前加上“.”或者 source(不需要赋执行权限)
第三种脚本调用方式,与前两者不同,前两者相当于在当前bash内部加入一个子bash
而第三种方式相当于,在本bash中运行
这种差异主要体现在子父变量可使用范围的差异
父的全局变量可以被子bash获取,局部变量不可被子bash获取,子bash的变量父全都无法获得。
定义变量 变量名=变量值
消除变量 unset 变量名
声明静态变量 readonly 变量 (其中静态变量无法被消除)
声明全局变量 export 变量名
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
(2)等号两侧不能有空格
(3)在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算。
(4)变量的值如果有空格,需要使用双引号或单引号括起来。
$n(功能描述:n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,十以
上的参数,十以上的参数需要用大括号包含,如${10})
主要作用用于获取调用脚本时传入的参数
$# (功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及
加强脚本的健壮性)
#!/bin/bash
echo $1
echo $2
echo '=========$#==========='
echo "现在有"$#"参数"
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
$?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一
个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明 上一个命令执行不正确了。)
[root@hadopp100 shells]# . a.sh 1 2 3
1
2
=========$#===========
现在有3参数
[root@hadopp100 shells]# echo $?
0
$((运算式)) 或 $[运算式]
计算5+3*6*(2+1)的值
[root@hadopp100 shells]# echo $[5+3*6*(2+1)]
59
[ condition ](注意 condition 前后要有空格)
整数比较
-eq 等于(equal) -lt 小于(less than) -gt 大于(greater than)
-ne 不等于(not equal) -le 小于等于(less equal) -ge 大于等于(greater equal)
字符串之间的比较 ,用等号“=”判断相等;用“!=”判断不等。
按照文件权限进行判断
-r 有读的权限(read) -w 有写的权限(write) -x 有执行的权限(execute)
按照文件类型进行判断
-e 文件存在(existence) -f 文件存在并且是一个常规的文件(file) -d 文件存在并且是一个目录(directory)
多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一 条命令执行失败后,才执行下一条命令)
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
和Java,c语言的if语句类似这边不多解释
注意事项: ①[ 条件判断式 ],中括号和条件判断式之间必须有空格 ②if后要有空格
语法1
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
#使用举例
sum=0
for((i=0;i<=100;i++))
do
sum=$[$sum+$i]
done
echo $sum
语法2
for 变量 in 值 1 值 2 值 3…
do
程序
done
#使用举例
for i in a b c
do
echo "ban zhang love $i"
done
这里值得注意的是
$* ,$@
这两者的区别就出现了,主要体现在获取值的过程中,如果我们用"",括住我们的参数
$ @会把传入的一个个分开处理
$* 会把传入的列表全部合成一个字符串,中间以" "分开
echo '=============$*============='
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个 for 循环只会循环一次
do
echo "$i"
done
echo '=============$@============='
for j in "$@"
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
do
echo "$j"
done
=============$*=============
a b c d
=============$@=============
a
b
c
d
while [ 条件判断式 ]
do
程序
done
与Java,c类似,这边不过多介绍
read (选项) (参数)
①选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)如果-t 不加表示一直等待
②参数 变量:指定读取值的变量名
使用举例
#!/bin/bash
read -t 10 -p "你叫什么名字" n
echo $n
[root@hadopp100 shells]# . e.sh
你叫什么名字tony
tony
以上就是shell脚本编程的基础知识
来源于尚硅谷Linux课程,加以总结
如有侵权联系删