Shell基础
入参和默认变量
对于shell脚本而言,有些内容是专门用于处理参数的,它们都有特定的含义
/home/shouwang/test.sh para1 para2 para3
$0 $1 $2 $3
脚本名 第一个参数 第二个参数 第三个参数
除此之外,还有一些其他的默认变量,例如:
$# 代表脚本后面跟的参数个数,前面的例子中有3个参数
$@ 代表了所有参数,并且可以被遍历
$*代表了所有参数,且作为整体,和$*很像,但是有区别
$$ 代表了当前脚本的进程ID
$?代表了上一条命令的退出状态
执行脚本的方法
“./”:(相对或绝对路径)这种方法脚本必须得需要可执行权;
sh:通过/bin/sh来解释脚本;
source或“.”:内部命令来加载脚本中的内容。
前两种方法是在子shell中执行;第三种方法是在当前shell中执行
Shell变量
Linux系统下常见的四种变量 1.自定义变量 自定义变量是由系统用户自己定义的变量吗,只在用户自己的Shell环境中有效,因此,也有人称为本地变量。在编写Shell脚本程序是,用户通常会设定一些特定的自定义变量,以适应程序执行过程中各种变化,以满足不同的需求。
1>定义新的变量 定义变量的基本格式“变量名=变量值”,等号两边不允许有空格。变量名称需要以字母或下划线开头,名称中不要包含特殊字符(比如:+、-、*、/、……?、&、%等)。比如:
[root@linux /]# a=Hello
[root@linux /]# b=world
2>查看和引用变量 通常在变量名称前添加前导符“$”,可以引用一个变量的值。比如:
[root@linux /]# echo $a
Hello
[root@linux /]# echo $a $b
Hello world
当变量名称容易和紧跟其后的其他字符相互混淆时,需要使用“{}”将变量括起来,否则将报错。
[root@linux /]# echo $a123 #没有找到“product1234”这个变量
[root@linux /]# echo ${a}123 #正确输出变量和字符
Hello123
变量赋值的特殊操作
1>双引号(" "):双引号主要起界定字符串的作用,特别是当要复制的内容中包含空格是,必须以双引号括起来,其他情况双引号可以省略。比如:
[root@linux /]# a=Hello world
-bash: world: command not found
[root@linux /]# a="Hello world"
[root@linux /]# echo $a
Hello world
双引号还允许通过$符号引用其他变量值,比如:
[root@linux /]# b="123 $a"
[root@linux /]# echo $b
123 Hello world
2>单引号(' '):禁止引用其他变量值,$视为普通字符,单引号中的特殊符号都将视为普通字符,比如:
[root@linux /]# c='Hello $b'
[root@linux /]# echo $c
Hello $b
3>反撇号( ):主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。反撇号括起来的内容必须是可以执行的命令,否则将出错。比如:
[root@linux /]# ls -lh `which systemctl`
-rwxr-xr-x 1 root root 623K May 26 2017 /usr/bin/systemctl
注意:使用反撇号难以子啊一行命令中实现嵌套命令替换操作,这时可以使用“$()”来替代反撇号操作,解决嵌套问题。比如:
[root@linux /]# rpm -qc $(rpm -qf $(which useradd))
/etc/default/useradd
/etc/login.defs
//查询提供useradd命令程序的软件包所安装的配置文件位置
4>大括号({}):用来分割变量和字符;如果在变量后还有其他字符,就需要使用“{}”,{}中是变量。
read命令
read命令可以使从键盘输入的内容为变量赋值,比如:
[root@linux /]# read abc
123456 //输入给变量abc所赋的值
[root@localhost ~]# echo $abc
123456 //查看结果
为了使交互式操作的界面更加友好,提高易用性,read命令可以加“-p”选项来设置提示信息,以便告知用户应该输入什么内容等。比如:
[root@localhost ~]# read -p "请指定存放的目录:" abcd
请指定存放的目录:/opt/backup
[root@localhost ~]# echo $abcd
/opt/backup
设置变量的作用范围
默认情况下,新定义的变量只能在当前Shell环境中有效,因此称为局部变量;当进入子程序或者新的Shell时,局部变量将不能使用。比如:
[root@linux /]# echo "$a $b"
Hello world
[root@linux /]# /bin/sh //切换一个Shell环境
sh-4.2# echo "$a $b" //找不到这样的变量
sh-4.2# exit //返回上一个Shell
[root@linux /]#
为了使用户定义的变量可以在所有Shell环境中继续使用,减少重复的工作,可以通过内部命令export将指定的变量导出为全局变量。用户可以同时指定多个变量名称作为参数(无需使用“$”符),变量之间用空格分割即可!
[root@linux /]# export a b
[root@linux /]# /bin/sh
sh-4.2# echo "$a $b"
Hello world
数值变量的运算
在Bash Shell环境中,只能进行简单的整数运算,不支持小数运算。数值运算主要是通过内部命令expr进行。
常用的变量:
加法运算:+
减法运算: -
乘法运算: *
除法运算: /
求模(取余)运算: %
比如:
[root@linux /]# x=100
[root@linux /]# y=50
[root@linux /]# expr $x + $y
150
[root@linux /]# expr $x - $y
50
[root@linux /]# expr $x * $y
5000
[root@linux /]# expr $x / $y
2
[root@linux /]# expr $x % $y
0
位置变量
当执行命令行操作时,第一个字段表示命令字或脚本程序名,其余的字符串按照从左到右的顺序依次赋值给位置变量。 位置变量也称为位置参数,使用$1、$2…$8、$9表示。比如:
[root@linux /]# vim 123.sh
#!/bin/bash //声明使用何种Shell
SUM=`expr $1 + $2`
echo "$1 + $2=$SUM"
[root@linux /]# chmod +x 123.sh
[root@linux /]# ./123.sh 12 34 //$1为12、$2为34时
12 + 34=46
预定义变量
预定义变量是由Bash程序预先定义好的一类特殊变量,用户不可修改,预定义变量的格式:
$#:命令行中位置变量的个数
$*:所有位置变量的内容
$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
$0:当前执行的进程/程序名
命令执行
在shell中执行命令通常只需要像在终端一样执行命令即可,不过,如果想要命令结果打印出来的时候,这样的方式就行不通了。因此,shell的命令方式常有:
a=`ls` #`是左上角~键,不是单引号
或者使用$,后面括号内是执行的命令:
echo "current path is $(pwd)"
另外,前面两种方式对于计算表达式也是行不通的,而要采取下面的方式:
echo "1+1=$((1+1))" #打印:1+1=2
即$后面用两重括号将要计算的表达式包裹起来。
那如果要执行的命令存储在变量中呢?前面的方法都不可行了,当然括号内的内容被当成命令执行还是成立的。要使用下面的方式,例如:
a="ls"
echo "$($a)"
但是如果字符串时多条命令的时候,上面的方式又不可行了,而要采用下面的方式:
a="ls;pwd"
echo "$(eval $a)"
这是使用了eval,将a的内容都作为命令来执行。
- 转--Golang语言--复合数据
- 三步学会用spring开发OSGI——(第三步:web篇)
- Python标准库笔记(5) — sched模块
- 设计模式(4)-序列生成器之单例模式
- PyCharm 自定义文件和代码模板
- kotlin到底好在哪里?
- Django 1.10中文文档-第一个应用Part6-静态文件
- Django 1.10中文文档-第一个应用Part5-测试
- 设计模式(5)-己所不欲,施之于人(代理模式)
- Python标准库笔记(4) — collections模块
- 使用captcha模块生成图形验证码
- 设计模式(6)-装饰器(认识程序中的装饰器)
- Selenium Webdriver常用方法
- 设计模式(7)-模板(从事务处理应用的模板)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 搭建Typecho博客
- Python开发之Pandas的使用
- Python开发之numpy的使用
- flink sql实时计算当天pv写入mysql
- python爬取虎牙直播颜值区美女主播照片
- OpenCV图像处理笔记(三):霍夫变换、直方图、轮廓等综合应用
- 干货 | 高耦合场景下,Trip.com如何做支付设计与落地
- OpenCV图像处理笔记(二):图片操作进阶
- OpenCV图像处理笔记(一):图片基本操作
- BigData--Hadoop2.x新特性之HA
- 前端踩坑系列《四》
- BigData--Hadoop技术
- TensorFlow2.X学习笔记(8)--TensorFlow高阶API之构建模型、训练模型
- dotnet 使用 AsyncQueue 创建高性能内存生产者消费者队列
- TensorFlow2.X学习笔记(7)--TensorFlow中阶API之losses、metrics、optimizers、callbacks