Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。
注意: 本章使用命令行都是在腾讯云服务器上测试
Linux提供的shell解释器有哪些呢?
在日常开发中,我们经常使用的是以下两种
/bin/sh
/bin/bash
其实 sh底层使用的也是bash
linux默认使用的是 bash解析器
脚本以 #!/bin/bash 开头,作用就是指定解析器,其实 该行不写也可以,linux默认使用的就是bash,但为了提高可读性,最好写上。
创建脚本文件
touch helloworld.sh
使用vim 编辑
执行脚本
sh helloworld.sh
注意:如果在执行脚本文件时想省略 sh 或 bash ,脚本文件必须拥有执行权限
从上图可知,此时 helloworld.sh文件对于当前用户只有 可读可写的权限,并没有执行的权限
对于文件所有者添加执行的权限
chmod u+x helloworld.sh
需求:
进入 /usr/local 目录下
创建 t1.txt文件
向文件追加内容 “你好”
#!/bin/bash
cd /usr/local
touch t1.txt
echo "你好" >> t1.txt
名称 | 说明 |
---|---|
$HOME | 当前用户根路径,系统用户为/root,其它用户/home/xxx |
$USER | 用户名称 |
$PWD | 当前路径 |
$SHELL | 默认的shell解析器 |
变量名称=值
注意: 等号两侧不能有空格
使用 unset 变量名称,来撤销变量
A=SQL
echo $A
unset A
静态(只读)变量,不能unset撤销
readonly 变量名称=值
readonly B=123
注意: bash中变量默认类型都是字符串类型,无法直接进行数值加减操作
export会把变量提升为全局变量,其它shell脚本就可以使用该变量。
语法:
export 变量名称
A=sql
export A
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,$0 代表该脚本名称(包含文件路径),1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……十以上的参数需要使用大括号 ${10}
parametre.sh
#!/bin/bash
echo $0 $1 $2
$# 获取所有输入参数个数,常用于循环
#!/bin/bash
echo $0 $1 $2
echo $#
$* 表示命令行输入的所有参数,在一个字符串内输出 “参数1 参数2 参数3 …”
$@ 和 $* 类似,也是获取所有输入参数,但是会把参数分隔开来,“参数1” “参数2”
#!/bin/bash
echo $0 $1 $2
echo $#
echo $*
echo $@
注意: 虽然看起来两行输出相同,但是意义不一样
上面的sql 123 表示一个字符串,字符串的内容是 sql 123,等价于 “sql 123”。
下面的sql 123表示两个字符串,“sql” 和"123"
命令 | 说明 |
---|---|
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误 |
语法一: $((运算式)) 或 $[运算式]
语法二: expr 运算符
运算符包括 +,-,*,/,%,分别表示 加,减,乘,除,取余
注意: expr 运算符之间必须要有空格
#!/bin/bash
var1=`expr 1 + 2`
echo "1 + 2 = $var1"
`expr 2 + 3` 反引号``内的内容会被当成一个整体,用来实现(2+3)
使用语法一来计算
echo $[(2+3)*4]
语法
[ 条件表达式]
注意: 条件表达式前后必须有空格; 条件非空即为true,[ 123 ] 返回true,[] 返回false
表达式 | 说明 |
---|---|
= | 字符串比较 |
-lt | 小于less than |
-le | 小于等于less equal |
-eq | 等于equal |
-gt | 大于greater than |
-ge | 大于等于greater equal |
-ne | 不等于not equal |
表达式 | 说明 | 示例 |
---|---|---|
-r | 有读的权限read | [ -r add.sh ] |
-w | 有写的权限write | |
-x | 有执行的权限execute |
表达式 | 说明 |
---|---|
-e | 文件存在existence |
-f | 文件存在,并且是常规文件file |
-d | 文件存在,并且是一个目录 |
&& 逻辑与
|| 逻辑或
用法与其它语言类似
语法
if [ 条件判断 ];then
程序
fi
或者
if [ 条件判断 ]
then
程序
fi
注意: if 和 []处的空格
#!/bin/bash
if [ $1 -ge 90 ]
then
echo "优"
elif [ $1 -ge 80 ]
then
echo "良"
elif [ $1 -ge 70 ]
then
echo "中"
else
echo "差"
fi
语法
case $变量名 in
"值 1")
如果变量的值等于值1,则执行程序1
;;
"值 2")
如果变量的值等于值2,则执行程序2
;;
... 同理,其它分支...
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
#!/bin/bash
case $1 in
"Y")
echo "选择Yes"
;;
"N")
echo "选择No"
;;
*)
echo "输入非法"
;;
esac
#!/bin/bash
case $1 in
[9][0-9] | 100)
echo "优"
;;
[8][0-9])
echo "良"
;;
[7][0-9])
echo "中"
;;
*)
echo "差"
;;
esac
语法1
for(( 初始值;循环控制条件;条件变化 ))
do
程序
done
#!/bin/bash
s=0
for(( i=0;i<=100;i++))
do
s=$[$s+$i]
done
echo "sum为$s"
语法2
for 变量 in item1 item2 ... itemN
do
程序
done
#!/bin/bash
s=0
for i in $*
do
s=$[$s+$i]
done
echo "和为$s"
语法
while [ 条件表达式 ]
do
程序
done
read可以读取控制台输入值
语法
read(选项)(参数)
选项:
-p: 提示内容,例如: 请输入姓名
-t: 等待时间,超过该时间还没有输入的话,就结束
参数:
变量: 指定读取值的变量,将读取值赋值给该变量
#!/bin/bash
read -t 10 -p "请输入姓名" NAME
echo "您的姓名:$NAME"