shell是什么
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序。
用户可以用Shell来启动,挂起,停止,编写一些程序。
Shell脚本执行方式
脚本格式要求
- 脚本以 #!/bin/bash 开头
- 脚本需要有可执行权限
- 一般shell脚本文件以 .sh 为后缀
- 在shell中用 # 表示注释
- 多行注释为 起始处 :<结尾处!
创建的shell脚本文件即使是root权限也不会给x执行权限,需要自己增加
脚本常用执行方式
- 输入脚本的绝对路径或相对路径
需要该脚本的执行权限
2.
sh 脚本.sh
这样不需要执行权限 需要cd跳转到存放sh脚本文件的目录下才可使用
Shell变量
Shell变量介绍
- Linux的Shell中变量分为, 系统变量和 用户自定义变量
- 系统变量: (HOME,) PWD, (SHELL,) USER等等
- 显示当前shell中所有变量
set
Shell用户自定义的变量
基本语法(在 xxx.sh 文件内)
- 定义变量
变量=值
- 输出变量
echo $变量
输出变量为 $变量名
即使是 echo “A=$A”,shell也会将 $变量名 这种格式的认为是变量而不是字符串
必须 变量=值 之间不能存在空格!
- 撤销变量
unset 变量名
- 声明静态变量
静态变量不会被反复定义和初始化
静态变量一旦定义就无法unset了
readonly 变量名=值
Shell变量的定义规则
- 变量名可以由, 字母, 数字, 下划线组成, 不能以数字开头
- 等号俩侧不能有空格!
- 变量名一般为大写
- 如果用变量表示路径的时候必须用大括号!
将指令返回的结果赋值给变量
A=命令
A=$(命令)
A=${命令} #最好使用这个,防止在用变量表示路径的时候出错!
命令上面是 反引号!在tab键上面一个键
设置环境变量
基本语法
将shell变量输出为环境变量
- 让这个变量可以在其他文件中使用。
- 设置环境变量必须在 /etc/profile 文件内
- 这个文件也设置jdc等环境变量
- 设置环境变量后需要 source 才能让配置生效
1.
export 变量名=变量值
让修改后的配置信息立即生效
2.
source 配置文件
查询环境变量的值
3.
echo $变量名
位置参数变量
假设我们输入命令
./hello.sh 100 200 300
要想让shell脚本文件获取到这个 100 200 300数据,就可以使用位置参数变量了
基本语法
- $n
- n为数字
- $0 代表命令本身,$1~$9 代表第一个到第9个参数
- 10以上的参数用 ${10} 这样写
- $*
- 这个表示所有参数
- $*把所有参数当成一个整体
- $@
- 这个表示所有参数
- $# 把所有参数区分当成个体看呆
- $#
- 这个代表所有参数的个数
预定义变量
就是shell设计者事先定义好的变量,可以直接在shell脚本中使用。
基本语法
- [ 当前进程的进程号 ]
- $? 最好溢出执行的命令的返回状态,如果这个变量值为0,证明上一个命令正确执行,否则就不正确执行
路径 &
这种方式可以让程序在后台执行
运算符
基本语法
$((运算表达式))
expr m + n
$[运算式]
如果要将expr的运算表达式赋给变量,需要用反引号将其包含起来
expr中符号的用法:
* 乘
/ 除
% 取余
m + n 在expr中需要存在空格!
条件判断
判断语句基本语法 (双分支)
if [ 判断条件 ]
then
条件为true执行的语句
else
条件为flase执行的语句
fi
简写法:
[ 判断条件 ] && 条件为true执行语句
- 判断条件前后要有空格
- if 和条件之间需要空格
- [ ]返回false(有空格!)
- [ dwadwa ]返回true
- 0为true ,>1 为false
常用判断条件
在前面加上 ! 即为否定
比如 ! -f 文件不存在
- 字符串之间比较 =
if [ 字符串1 = 字符串2 ]
- 俩个整数的比较
if [ 1 -lt 2 ]
符号 描述 -lt 小于 -le 小于等于 -eq 等于 -gt 大于 -ge 大于等于 -ne 不等于
3. 按照文件权限判断
if [ 选项 文件路径 ]
符号 描述 -r 有读的权限 -w 有写的权限 -x 有执行的权限
4. 按照文件类型进行判断
if [ 符号 文件路径 ]
符号 描述 -f 文件存在且是一个常规文件 -e 文件存在 -d 文件存在且是一个目录
流程控制(多分支if)
基本语法
if [ 条件判断 ]
then
代码
elif [ 条件判断 ]
then
代码
...
fi
流程控制(case语句)
基本语法
case $变量名 in
"值1")
代码1
;;
"值2")
代码2
;;
.....
*)
最终情况
;;
esac
循环
for循环
基本语法1
for 变量 in 值1 值2 值3...
do
代码
done
举例:
for i in $*
do
echo "num is $i"
done
输入10 11 12
输出 num is 10 11 12
因为$*是把位置参数当成整体
for i in $@
do
echo "num is $i"
done
输入10 11 12
输出
num is 10
num is 11
num is 12
因为$@是把位置参数当成了个体
基本语法2
for((初始变量;循环条件;变量变化))
do
代码
done
举例
从1加到100的值输出显示
SUM=0 #给SUM变量初始化
for((i=1;i<=100;i++)) do sum="$[$SUM+$i]" #运算符,这里的sum不加美元符号是因为这里是给sum赋值 done echo "$sum" < code></=100;i++))>
while循环
需要注意的是条件判断前后需要空格
while 和条件之间也需要空格
且这里的条件和for里面循环条件不同, 这里的循环条件要用if里面的规则!
基本语法
while [ 条件判断 ]
do
程序
done
举例
从1加到n的值
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "SUM=$SUM"
read读取控制台输入(相当于scanf,Scanner这种)
基本语法
read (选项) (参数) 接受值得变量
选项
-p 指定读取值时的提示信息
-t 指定读取值的等待时间,如果未在规定时间输入就不等待
举例
read -p "请输入一个值num=" NUM
其中NUM1是接受从控制台输入值的变量
-p 后面的内容是从控制台等待读取值的时候的提示信息
这个相当于scanf(“请输入一个值num=%d”,$NUM1)
read -t 10 NUM2
等待10s如果10后没有获取到数值就停止等待
结合起来写法
read -p 参数 -t 参数 接受值变量
函数
shell编程有系统函数和自定义函数俩种。
系统函数
常用几个系统函数!多的自己查=-=
basename
功能:返回完整路径最后 / 的部分,常用于获取文件名
基本语法
basename 文件路径 文件后缀
basename会删除掉所有的前缀包括最后一个 ‘/’ 字符,然后将字符串显示出来
举例
basename /home/aaa/text.txt 这样会返回 text.txt 这个字符串
basename /home/aaa/text.txt .txt 这样会返回 text 这个字符串
dirname
功能:返回完整路径最后 ‘/’ 的前面部分,常用于返回路径部分
基本语法
dirname 绝对路径
举例
dirname /home/aaa/bbb/a.txt 这样返回 /home/aaa/bbb 这个字符串
自定义函数
基本语法
function 函数名()
{
代码块;
return $变量 #如果不需要返回值就可以不写return
}
调用方法
函数名 值1 值2 值3....
自定义函数的括号里面不需要加形参!
在自定义函数内部的 $1,$2是形参,代表的是
函数名 值1 值2 值3
$1是值1,$2是值2
一般的我们会在调用函数后使用 $? 来调用结果
但是这个只能获取到0到255之间的数
常用几种写法
写法1
function add()
{
s=$[ $1 + $2 ]
retrun $s
}
read -p "第一个值" a
read -p "第二个值" b
add $a $b
echo $? #前面一条命令执行的结果代码,这个结果代码只能返回0--255
解决return只能返回0~255的方法
举例:
function add()
{
s=$[ $1 + $2 ] #这里的1和2是形参,代表a,b的值
echo $s #打印输出s的变量值
}
read -p "第一个数=" a
read -p "第二个数=" b
sum=$(add $a $b) #打印输出的值赋给sum变量!
echo $sum
局部变量
一般用于定义局部变量,用于函数体内, 作用域为定义位置开始到函数结束
local 变量名=值
这样定义的是局部变量
Original: https://www.cnblogs.com/wdadwa/p/Linux_Learning_11.html
Author: wdadwa
Title: Linux–>shell
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611726/
转载文章受原作者版权保护。转载请注明原作者出处!