shell使用方式
手工方式:
手工敲击键盘,在shell的命令行输入命令,按Enter后,执行通过键盘输入的命令,然后shell返回并显示命令执行的结果.
重点:逐行输入命令、逐行进行确认执行
脚本方式:
就是说我们把手工执行的命令a,写到一个脚本文件b中,然后通过执行脚本b,达到执行命令a的效果
在计算机科学中,Shell就是一个命令解释器:
shell脚本示例
现在我们来使用脚本的方式来执行以下
#!/bin/bash
# 这是临时shell脚本
echo 'nihao'
echo 'itcast'
脚本执行效果
[root@linux-node1 ~]# /bin/bash itcast.sh
nihao
itcast
SHELL 基础知识
创建脚本的常见编辑器是 vi/vim.
多行注释有两种方法::<<! ... ! 和 :<<字符 ... 字符
Shell脚本的执行通常可以采用以下几种方式
1、脚本文件本身没有可执行权限或者脚本首行没有命令解释器时使用的方法,我们推荐用bash执行(通常用第一着种方式)
2、脚本文件具有可执行权限时使用
3、使用source或者.点号,加载shell脚本文件内容,使shell脚本内容环境和当前用户环境一致
脚本开发规范
1.脚本命名要有意义,文件后缀是.sh
2、脚本文件首行是而且必须是脚本解释器
3.脚本文件解释器后面要有脚本的基本信息等内容
4、脚本文件常见执行方式:bash 脚本名
5、脚本内容执行:从上到下,依次执行
6、代码书写优秀习惯;
7、通过缩进让代码易读;(即该有空格的地方就要有空格)
定义普通变量:
方式一:变量名=变量值
方式二:变量名='变量值'
方式三:变量名="变量值"
命令变量
定义方式一:变量名=`命令`
注意:` 是反引号
定义方式二:变量名=$(命令)
执行流程:
1、执行`或者$()范围内的命令
2、将命令执行后的结果,赋值给新的变量名A
查看全局变量命令 env
定义全局变量:
方法一:
变量=值
export 变量
方法二:(最常用)
export 变量=值
查看变量
${变量名}
场景:
echo " dsa dsafsa dsafsa ${变量名} f "
使用频率较高
取消变量 unset 变量名
符号 意义
$0 获取当前执行的shell脚本文件名,包括脚本路径
#!/bin/bash
# 获取脚本的名称
echo "我脚本的名称是: file.sh"
echo "我脚本的名称是:$0"
$n 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大 括号括起来${10}
#!/bin/bash
# 获取当前脚本传入的参数数量
echo "当前脚本传入的参数数量是: $#"
# 获取指定位置的参数
echo "第一个位置的参数是: $1"
echo "第二个位置的参数是: $2"
echo "第三个位置的参数是: $3"
echo "第四个位置的参数是: $4"
$# 获取当前shell命令行中参数的总个数
$? 获取执行上一个指令的返回值(0为成功,非0为失败)
# bash nihao
bash: nihao: No such file or directory
# echo $?
127
# ls
file1.sh num.sh test.sh weizhi.sh
# echo $?
0
字符串精确截取
格式:${变量名:起始位置:截取长度}
示例:
${file:0:5} 从第1个字符开始,截取5个字符
${file::5} 从第1个字符开始,截取5个字符
${file:5:5} 从第6个字符开始,截取5个字符
${file:5} 从第6个字符开始,截取后面所有的字符
${file:0-5} 从倒数第5个字符开始,截取后面所有的字符
${file:0-6:3} 从倒数第6个字符开始,截取之后的3个字符
默认值相关
格式1:
${变量名:-默认值}
套餐示例:
如果我输入的参数为空,那么输出内容是 "您选择的套餐是: 套餐 1"
如果我输入的参数为n,那么输出内容是 "您选择的套餐是: 套餐 n"
#!/bin/bash
# 套餐选择演示
a="$1"
echo "您选择的套餐是: 套餐 ${a:-1}"
格式2:
${变量名+默认值}
场景示例:
不管我说国家法定结婚年龄是 多少岁,都输出 国家法定结婚年龄(男性)是 22 岁
#!/bin/bash
# 默认值演示示例二
a="$1"
echo "国家法定结婚年龄(男性)是 ${a+22} 岁"
条件表达式
&&
命令1 && 命令2
如果命令1执行成功,那么我才执行命令2 -- 夫唱妇随
如果命令1执行失败,那么命令2也不执行
示例:
# [ 1 = 1 ] && echo "条件成立"
条件成立
# [ 1 = 2 ] && echo "条件成立"
#
||
命令1 || 命令2
如果命令1执行成功,那么命令2不执行 -- 对着干
如果命令1执行失败,那么命令2执行
示例:
# [ 1 = 2 ] || echo "条件不成立"
条件不成立
# [ 1 = 1 ] || echo "条件不成立"
#
测试语句形式
A: test 条件表达式
B: [ 条件表达式 ]
[]两侧要有空格
root@ubuntu:~# [1 = 1 ]
[1: command not found
文件表达式
-f 判断输入内容是否是一个文件
示例:
# [ -f weizhi.sh ] && echo "是一个文件"
是一个文件
# [ -f weizhi.sddh ] || echo "不是一个文件"
不是一个文件
-d 判断输入内容是否是一个目录
示例:
# [ -d weizhi.sddh ] || echo "不是一个目录"
不是一个目录
# mkdir nihao
# [ -d nihao ] && echo "是一个目录"
是一个目录
-x 判断输入内容是否可执行
示例:
# [ -x age.sh ] || echo "文件没有执行权限"
文件没有执行权限
# [ -x test.sh ] && echo "文件有执行权限"
文件有执行权限
数值操作符
n1 -eq n2 相等
n1 -gt n2 大于
n1 -ge n2 大于等于
n1 -lt n2 小于
n1 -le n2 小于等于
n1 -ne n2 不等于
字符串比较
str1 == str2 str1和str2字符串内容一致
str1 != str2 str1和str2字符串内容不一致,!表示相反的意思
root@ubuntu:~# [ a == a ]
root@ubuntu:~# echo $?
0
root@ubuntu:~# [ a != a ]
root@ubuntu:~# echo $?
1
计算表达式
方式一:$(()) $(( 计算表达式 )) $(())中只能用+-*/和()运算符,并且只能做整数运算
方式二:let let 计算表达式
重定向符号
> 符号
> 表示将符号左侧的内容,以覆盖的方式输入到右侧文件中
使用重定向符号给文件中增加内容
admin-1@ubuntu:~$ echo "file1.txt" > file.txt
>> 符号
>> 表示将符号左侧的内容,以追加的方式输入到右侧文件的末尾行中
使用重定向符号给文件中增加内容
admin-1@ubuntu:~$ echo "file2.txt" >> file.txt
命令1 | 命令2
管道符左侧命令1 执行后的结果,传递给管道符右侧的命令2使用