Shell常用内容汇总
文章目录
- 概述
- Shell解析器
- Linux提供的Shell解析器
- bash和sh的关系
- CentOS默认的解析器是bash
- Shell脚本入门
- 脚本格式
- 第一个Shell脚本:helloworld
- 第二个Shell脚本:多命令处理
- Shell中的变量
- 系统变量
- 自定义变量
- 特殊变量:$n
- 特殊变量:$#
- 特殊变量:\$*、\$@
- 特殊变量:$?
- 运算符
- 条件判断
- 基本语法
- 案例实操
- 流程控制
- if判断
- case语句
- for循环
- while循环
- read读取控制台输入
概述
Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核
Shell是一个功能相当强大的变成语言,易编写、易调试、灵活性强
Shell解析器
Linux提供的Shell解析器
[root@CentOS001 ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
bash和sh的关系
[root@CentOS001 bin]# ll |grep bash
-rwxr-xr-x. 1 root root 906568 3月 23 2017 bash
lrwxrwxrwx. 1 root root 4 3月 23 2020 sh -> bash
[root@CentOS001 bin]#
CentOS默认的解析器是bash
[root@CentOS001 bin]# echo $SHELL
/bin/bash
[root@CentOS001 bin]#
Shell脚本入门
脚本格式
脚本以#!/bin/bash开头(指定解析器)
第一个Shell脚本:helloworld
(1)需求:创建一个Shell脚本,输出helloworld
(2)案例实操:
[root@CentOS001 shell2020]# touch helloworld.sh[root@CentOS001 shell2020]# vim helloworld.sh
在helloworld.sh中输入如下内容
#!/bin/bashecho "hello the world"
(3)脚本的常用执行方式
第一种:采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)
sh+脚本的相对路径
[root@CentOS001 shell2020]# sh helloworld.sh hello the world
sh+脚本的绝对路径
[root@CentOS001 shell2020]# sh /home/datas/shell2020/helloworld.sh hello the world
bash+脚本的相对路径
[root@CentOS001 shell2020]# bash helloworld.sh hello the world
bash+脚本的绝对路径
[root@CentOS001 shell2020]# bash /home/datas/shell2020/helloworld.sh hello the world
第二种:采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)
(a)首先要赋予helloworld.sh 脚本的+x权限
[root@CentOS001 shell2020]# chmod 777 helloworld.sh
(b)执行脚本
相对路径
[root@CentOS001 shell2020]# ./helloworld.sh hello the world
绝对路径
[root@CentOS001 shell2020]# /home/datas/shell2020/helloworld.sh hello the world
注意:第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。
第二个Shell脚本:多命令处理
(1)需求:
在/home/shell2020/目录下创建一个banzhang.txt,在banzhang.txt文件中增加“I love cls”。
(2)案例实操:
[root@CentOS001 shell2020]# touch batch.sh[root@CentOS001 shell2020]# vi batch.sh
在batch.sh中输入如下内容
#!/bin/bash cd /home/shell2020touch cls.txtecho "I love cls" >>cls.txt
Shell中的变量
系统变量
- 常用系统变量
$HOME、$PWD、$SHELL、$USER等
- 案例实操
(1)查看系统变量的值
[root@CentOS001 shell2020]# echo $HOME
/root
[root@CentOS001 shell2020]#
[root@CentOS001 shell2020]# echo $PWD
/shell2020
[root@CentOS001 shell2020]#
[root@CentOS001 shell2020]# echo $USER
root
[root@CentOS001 shell2020]#
(2)显示当前Shell中所有变量:set
[root@CentOS001 shell2020]# set
B=700
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.1.2(2)-release'
自定义变量
基本语法
- 定义变量:变量=值
- 撤销变量:unset 变量
- 声明静态变量:readonly变量,注意:不能unset
变量定义规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
- 等号两侧不能有空格
- 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
- 变量的值如果有空格,需要使用双引号或单引号括起来。
案例实操
(1)定义变量A
[root@CentOS001 shell2020]# A=40
[root@CentOS001 shell2020]#
[root@CentOS001 shell2020]# echo $A
40
[root@CentOS001 shell2020]#
(2)给变量A重新赋值
[root@CentOS001 shell2020]# A=900
[root@CentOS001 shell2020]# echo $A
900
[root@CentOS001 shell2020]#
(3)撤销变量A
[root@CentOS001 shell2020]# unset A
[root@CentOS001 shell2020]#
[root@CentOS001 shell2020]# echo $A[root@CentOS001 shell2020]#
(4)声明静态的变量B=2,不能unset
[root@CentOS001 shell2020]#
[root@CentOS001 shell2020]# readonly C=444
[root@CentOS001 shell2020]# echo $C
444
[root@CentOS001 shell2020]# C=5555
-bash: C: readonly variable
[root@CentOS001 shell2020]# unset C
-bash: unset: C: cannot unset: readonly variable
[root@CentOS001 shell2020]#
(5)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
[root@CentOS001 shell2020]# W=1+2
[root@CentOS001 shell2020]# echo $W
1+2
[root@CentOS001 shell2020]#
(6)变量的值如果有空格,需要使用双引号或单引号括起来
[root@CentOS001 shell2020]#
[root@CentOS001 shell2020]# A=I LOVE YOU
-bash: LOVE: command not found
[root@CentOS001 shell2020]#
[root@CentOS001 shell2020]# A="I LOVE YOU"
[root@CentOS001 shell2020]# echo $A
I LOVE YOU
[root@CentOS001 shell2020]#
(7)可把变量提升为全局环境变量,可供其他Shell程序使用
export 变量名
[root@CentOS001 shell2020]# vim helloworld.sh
在helloworld.sh文件中增加echo $B
#!/bin/bashecho "helloworld"echo $B
[root@CentOS001 shell2020]# ./helloworld.sh Helloworld
发现并没有打印输出变量B的值。
[root@CentOS001 shell2020]# export B[root@CentOS001 shell2020]# ./helloworld.sh helloworld2
特殊变量:$n
基本语法
$n (功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
案例实操
(1)输出该脚本文件名称、输入参数1和输入参数2 的值
[root@CentOS001 data]# touch parameter.sh [root@CentOS001 data]# vim parameter.sh
\#!/bin/bash
echo "$0 $1 $2"
[root@CentOS001 data]# chmod 777 parameter.sh[root@CentOS001 data]# ./parameter.sh cls xz./parameter.sh cls xz
特殊变量:$#
基本语法
$# (功能描述:获取所有输入参数个数,常用于循环)。
案例实操
(1)获取输入参数的个数
[root@CentOS001 data]# vim parameter.sh
#!/bin/bashecho "$0 $1 $2"echo $#
[root@CentOS001 data]#chmod 777 parameter.sh[root@CentOS001 data]# ./parameter.sh cls xzparameter.sh cls xz 2
特殊变量:$*、$@
基本语法
- $* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
- $@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
案例实操
(1)打印输入的所有参数
[root@CentOS001 data]# vim parameter.sh
#!/bin/bashecho "$0 $1 $2"echo $#echo $*echo $@
[root@CentOS001 data]# bash parameter.sh 1 2 3parameter.sh 1 231 2 31 2 3
特殊变量:$?
基本语法
$?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
案例实操
(1)判断helloworld.sh脚本是否正确执行
[root@CentOS001 data]# ./helloworld.sh hello world[root@CentOS001 data]# echo $?0
运算符
基本语法
- “$((运算式))”或“$[运算式]”
- expr + , - , *, /, % 加,减,乘,除,取余
- 注意:expr运算符间要有空格
案例实操:
(1)计算3+2的值
[root@CentOS001 data]# expr 2 + 35
(2)计算3-2的值
[root@CentOS001 data]# expr 3 - 2 1
(3)计算(2+3)X4的值
- expr一步完成计算
[root@CentOS001 data]# expr `expr `2 + 3` \* 420
- 采用$[运算式]方式
[root@CentOS001 data]# S=$[(2+3)*4][root@CentOS001 data]# echo $S
条件判断
基本语法
[ condition ](注意condition前后要有空格)
注意:条件非空即为true,[ htzw]返回true,[] 返回false。
常用判断条件
- (1)两个整数之间比较
- = 字符串比较
- -lt 小于(less than) -le 小于等于(less equal)
- -eq 等于(equal) -gt 大于(greater than)
- -ge 大于等于(greater equal) -ne 不等于(Not equal)
- (2)按照文件权限进行判断
- -r 有读的权限(read) -w 有写的权限(write)
- -x 有执行的权限(execute)
- (3)按照文件类型进行判断
- -f 文件存在并且是一个常规的文件(file)
- -e 文件存在(existence) -d 文件存在并是一个目录(directory)
- (1)两个整数之间比较
案例实操
(1)23是否大于等于22
[root@CentOS001 data]# [ 23 -ge 22 ]
[root@CentOS001 data]# echo $?
0
[root@CentOS001 data]#
(2)helloworld.sh是否具有写权限
[root@CentOS001 data]# [ -w helloworld.sh ][root@CentOS001 data]# echo $?0
(3)/home/atguigu/cls.txt目录中的文件是否存在
[root@CentOS001 data]# [ -e /home/atguigu/cls.txt ][root@CentOS001 data]# echo $?1
(4)多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令;|| 表示上一条命令执行失败后,才执行下一条命令)
[root@CentOS001 data]# [ condition ] && echo OK || echo notokOK[root@CentOS001 data]# [ condition ] && [ ] || echo notoknotok
流程控制
if判断
- 基本语法
if [ 条件判断式 ];then 程序 fi 或者 if [ 条件判断式 ] then 程序 fi
注意事项:
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格
- 案例实操
(1)输入一个数字,如果是1,则输出banzhang zhen shuai,如果是2,则输出cls zhen mei,如果是其它,什么也不输出。
[root@CentOS001 data]# touch if.sh[root@CentOS001 data]# vim if.sh
#!/bin/bashif [ $1 -eq "1" ]thenecho "banzhang zhen shuai"elif [ $1 -eq "2" ]thenecho "cls zhen mei"fi
[root@CentOS001 data]# chmod 777 if.sh [root@CentOS001 data]# ./if.sh 1banzhang zhen shuai
case语句
- 基本语法
case $变量名 in "值1") 如果变量的值等于值1,则执行程序1 ;; "值2") 如果变量的值等于值2,则执行程序2 ;; …省略其他分支… *) 如果变量的值都不是以上的值,则执行此程序 ;; esac
注意事项:
case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
双分号“****;;****”表示命令序列结束,相当于java中的break。
最后的“*)”表示默认模式,相当于java中的default。
- 案例实操
(1)输入一个数字,如果是1,则输出banzhang,如果是2,则输出cls,如果是其它,输出renyao。
[root@CentOS001 data]# touch case.sh[root@CentOS001 data]# vim case.sh
!/bin/bashcase $1 in"1")echo "banzhang";;"2")echo "cls";;*)echo "renyao";;esac
[root@CentOS001 data]# chmod 777 case.sh[root@CentOS001 data]# ./case.sh 11
for循环
- 基本语法1
for (( 初始值;循环控制条件;变量变化 )) do 程序 done
- 案例实操
(1)从1加到100
[root@CentOS001 data]# touch for1.sh[root@CentOS001 data]# vim for1.sh
#!/bin/bashs=0for((i=0;i<=100;i++))dos=$[$s+$i]doneecho $s
[root@CentOS001 data]# chmod 777 for1.sh [root@CentOS001 data]# ./for1.sh “5050”
- 基本语法2
for 变量 in 值1 值2 值3… do 程序 done
- 案例实操
(1)打印所有输入参数
[root@CentOS001 data]# touch for2.sh[root@CentOS001 data]# vim for2.sh
#!/bin/bash\#打印数字for i in $*doecho "ban zhang love $i "done
[root@CentOS001 data]# chmod 777 for2.sh [root@CentOS001 data]# bash for2.sh cls xz bdban zhang love clsban zhang love xzban zhang love bd
比较$*和$@区别
$*和$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n的形式输出所有参数。
[root@CentOS001 data]# touch for.sh[root@CentOS001 data]# vim for.sh
#!/bin/bash for i in $*do echo "ban zhang love $i "done for j in $@do echo "ban zhang love $j"done
[root@CentOS001 data]# bash for.sh cls xz bdban zhang love cls ban zhang love xz ban zhang love bd ban zhang love cls ban zhang love xz ban zhang love bd
当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “$2”…”$n”的形式输出所有参数。
[root@CentOS001 data]# vim for.sh
#!/bin/bash for i in "$*" #$*中的所有参数看成是一个整体,所以这个for循环只会循环一次 do echo "ban zhang love $i"done for j in "$@" #$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次 do echo "ban zhang love $j" done
[root@CentOS001 data]# chmod 777 for.sh [root@CentOS001 data]# bash for.sh cls xz bd ban zhang love cls xz bd ban zhang love cls ban zhang love xz ban zhang love bd
while循环
- 基本语法
while [ 条件判断式 ] do 程序done
- 案例实操
(1)从1加到100
[root@CentOS001 data]# touch while.sh
[root@CentOS001 data]# vim while.sh
#!/bin/bashs=0
i=1
while [ $i -le 100 ]
dos=$[$s+$i]i=$[$i+1]
done
echo $s
[root@CentOS001 data]# chmod 777 while.sh
[root@CentOS001 data]# ./while.sh 5050
read读取控制台输入
基本语法
read(选项)(参数)
选项:
- -p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)。
- 参数
变量:指定读取值的变量名
案例实操
(1)提示7秒内,读取控制台输入的名称
[root@CentOS001 data]# touch read.sh [root@CentOS001 data]# vim read.sh
#!/bin/bashread -t 7 -p "Enter your name in 7 seconds " NAME echo $NAME
[root@CentOS001 data]# ./read.sh Enter your name in 7 seconds xiaoze xiaoze
Shell常用内容汇总相关推荐
- linux常用的命令shell,Linux操作系统Shell和常用命令汇总
简述 本文主要介绍Shell和Linux常用命令. Shell Shell 是一个用 C 语言编写的应用程序,提供了用户访问Linux操作系统内核服务的界面,它可以用来启动.挂起.停止.编写程序.Sh ...
- 史上最全的Linux常用命令汇总①收藏这一篇就够了!(超全,超详细)
史上最全的Linux常用命令汇总①(超全面!超详细!)收藏这一篇就够了! Linux命令基础 Shell Linux命令分类 Linux命令行的格式 编辑Linux命令行的辅助操作 获取命令帮助的方法 ...
- shell 字符串处理汇总(查找,替换等等)
http://blog.chinaunix.net/uid-20771623-id-3841521.html shell 字符串处理汇总(查找,替换等等) 字符串: 简称"串".有 ...
- Linux下Shell常用命令与工具
文章目录 Shell常用命令与工具 1.ls 2.echo 3.printf 4.cat 5.tac 6 .rev 7.wc 8.cp 9.mkdir 10.mv 11.rename 12.dirna ...
- shell常用的基础命令
shell常用的基础命令 1 diff命令 2 patch命令 3 cut命令 4 sort命令 5 uniq 命令 6 tr命令 7 &&和 || 8 test命令 8.1 test ...
- Linux Shell常用技巧(三) sed
Linux Shell常用技巧(三) sed 八.流编辑器sed 8.1 sed简介 sed是stream editor的缩写,一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区 ...
- PHP常用正则表达式汇总 [复制链接]
PHP常用正则表达式汇总 [复制链接] 上一主题下一主题 离线我是小猪头 法师 发帖 539 加关注 发消息 只看楼主 倒序阅读 使用道具楼主 发表于: 2011-06-22 更多 - 本帖被 ...
- python命令大全下载-Python pip 常用命令汇总
使用了这么就pip命令,但是一直是简单使用,很多命令都是用了查,查了用,今天把常用的命令汇总一下,方便使用. 命令: pip 由上图可以看到 pip 支持一下命令 Commands: install ...
- python常用命令大全-Python pip 常用命令汇总
使用了这么就pip命令,但是一直是简单使用,很多命令都是用了查,查了用,今天把常用的命令汇总一下,方便使用. 命令: pip 由上图可以看到 pip 支持一下命令 Commands: install ...
最新文章
- vector容器中erase(删除)的使用
- 1016. Phone Bills (25)
- HOWTO:如何修改InstallShield的运行环境
- leetcode算法题--字符串的排列
- Python代码块批量添加Tab缩进
- mysql MHA高可用架构安装
- html页面选择指定条件在下方显示,如何从符合特定条件的HTML中找到CSS选择器?...
- 如何申请outlook.com的邮箱
- getdatatable mysql_C# 自定义MySqlHelp类,包含了获取DataTable的方法,但是调用时总是提示“类型初始值设定项引发异常”...
- [LUOGU] P1111 修复公路
- 代替Reflection(反射)的一些方法(转)
- (转)惊鸿一瞥:人工智能,改变研究方式的力量
- 计算机单片机考试作弊检讨书,考试作弊检讨书(精选5篇)
- SQL练习题共50道附答案(MySQL
- JavaScript开发——文件夹的上传和下载
- 【2022修复版】社群扫码进群活码引流完整运营源码/带视频搭建教程
- Kotlin/DSL(Anko),原汁原味Kotlin开发Android---Activity Fragment与AnkoUI分离,强大的复用,更加便捷的开发
- python: 贝叶斯实现实例
- java ip加入黑名单_关于黑名单IP的设置
- 为什么一定要调用fclose函数