shell编程1:变量的使用与例子
一、Shell脚本的执行通常可以采用以下几种方式:
- 1):bash script-name或sh script-name(推荐使用)
- 2):path/script-name 或./script-name(当前路径下执行脚本)
- 3):source script-name或 . script-name #→注意”.”点号。
- 4):sh<script-name或cat scripts-name|sh(同样适合bash)
二、普通变量:
1:环境变量:变量必须是大写
- 1):配置永久性的环境变量,全局变量的配置文件:/etc/profile 、/etc/bashrc 基本上使用 /etc/profile
- 2):配置用户的环境变量的配置文件,分别是:用户的主目录下的隐藏文件:~/.bash_profile 、 ~/.bash_bashrc
- 3):临时设置 # export ZSY=1
- 4):设置所有用户生效的目录 :/etc/profile.d/ :目录下必须是脚本否则无法使用
- 5):如果写一个JAVA的脚本,要把JAVA环境变量放入脚本内,特别是定时任务执行的时候
- 6):显示环境变量:
- (1):# env //* 显示的环境变量
- (2):# set //* 显示的环境变量跟多
- 7):取消环境变量
- (1):# unset <环境变量名> //* 临时取消变量
- (2):进入文件删除变量
2:环境变量的意义:
- 1):UID :当前用户的UID
- 2):USER :当前登录的用户
- 3):HOME :当前的用户主目录
- 4): _= :上一条命令的最后一个参数
- 5):BASH :调用实例时使用的全路径
- 6):PS1 :当前的终端
- 7):PATH :命令所在路径
3:局部变量:
- 1):一般连续的字符串,数字,路径等可以不加任何引号,不过无引号的情况最好用双引号替代之。
- 2):如果变量中使用其他变量时,则不可以使用单引号否则无法使用:如下:
- [root@centos6 ~]# a='$USER'
- [root@centos6 ~]# echo $a
- $USER
- 3):如果变量中有空格的话,就必须使用双引号否则无法输出:如下:
- [root@centos6 ~]# a=1 2 3
- -bash: 2: command not found
- [root@centos6 ~]# a="1 2 3"
- [root@centos6 ~]# echo $a
- 1 2 3
4:引号的意义
- 1):无引号:把内容输出出来,会将未含有空格的字符串视为一个整体输出; 如果有命令(要在反引号中的)、变量、特殊转义符解析出结果然后子在输出最终内容来,如果字符串中有空格等特殊字符则则不能完整输出,需要加双引号,一般连续的字符串,数字,路径等可以不加任何引号, 不过无引号的情况最好用双引号替代之。
- 2):单引号:可以说是所见即所得:即将单引号内的所有内容都原样输出,或者描述为里面看到的是什么就会输出什么
- 3):双引号:把双引号内的所有内容都输出出来;如果有命令(要在反引号中的)、变量、特殊转义符解析出结果然后子在输出最终内容来。
- 4):反引号:一般用于执行命令,执行的时候命令会执行,同理可以使用 a=$(ls):结果相同
5:变量定义小结:
5.1. 普通变量:
- a=1 # 连续的数字字符串
- a="/etc/rc.local $USER" # 解析结果后输出
- a='$USER' # 原样输出
5.2. 命令内容定义:
- a=`ls` #反引号, 将反引号中字符当做命令输出
- a=$(ls)
5.3. 特殊变量:位置变量
1):$n :获取当前执行的shell脚本的第n个参数值(参数值默认以空格区分,如果参数加了双引号,则将双引号的整个作为一个参数, 不管其中是否有空格,如 例3 ),n=1..9 ,当 n 为0时表示脚本的文件名,如果n大于9,用大括号括起来${10},参数以空格隔开。如下:
- 例1:
- [root@centos6 ~]# echo $1 a
- a
- [root@centos6 ~]# echo $1 $2 a b
- a b
- 例2:
- [root@centos6 ~]# cat p.sh
- echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}
- [root@centos6 ~]# sh p.sh {a..z}
- a b c d e f g h i j k l m n o
- 例3:
- [root@centos6 ~]# cat p.sh
- echo $2
- [root@centos6 ~]# sh p.sh "1 2" "3 4"
- 3 4
- # 注意当整数超过9 时,数字要使用 “{}” 扩起来否则会出现 以下结果
- [root@centos6 ~]# cat p.sh
- echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
- [root@centos6 ~]# sh p.sh {a..z}
- a b c d e f g h i a0 a1 a2 a3 a4 a5
2):$0 获取当前脚本本身的名字
- $1 # 获取当前传递给该shell脚本的第一个参数
- $2 # 获取当前传递给该shell脚本的第二个参数
- $# # 获取当前传给脚本的参数个数
- $$ # 获取当前脚本运行的当前进程 PID 号
- $@ # 获取当前传给脚本的所有参数的列表
- $* # 获取当前以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
- $? # 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
3):$1 是传递给该shell脚本的第一个参数,一般系统启动文件最后都有这个,作为接收输入的命令如
- # /etc/init.d/sshd start # 是将 start 赋值给 $1,然后脚本根据这个参数执行这个参数下的命令:如下脚本:
- [root@centos6 ~]# cat p.sh
- case "$1" in
- start)
- echo "123" && exit 0
- ;;
- stop)
- echo "234" && exit 0
- ;;
- esac
- exit
- [root@centos6 ~]# /etp.sh start
- 123
- [root@centos6 ~]# sh p.sh stop
- 234
4):$0 是用来取脚本本身的名字,就是你命令之后跟的内个名字,如下图的 sh a.sh 中的 a.sh
- [root@centos6 ~]# cat a.sh
- echo $0
- [root@centos6 ~]# sh a.sh
- a.sh
- 例1:在启动脚本中也有 $0 ,当启动脚本的时候输入的不正确时就会出现
- [root@centos6 ~]# tail -4 /etc/init.d/sshd |head -1
- echo $"Usage: $0 {start|stop|restart|reload|force-reload|condrestart|try-restart|status}"
- [root@centos6 ~]# /etc/init.d/sshd *
- 用法: /etc/init.d/sshd {start|stop|restart|reload|force-reload|condrestart|try-restart|status}
- 例2:将文件与名字分离
- [root@centos6 etc]# cat ~/a.sh
- dirname $0
- basename $0
- [root@centos6 etc]# sh ~/a.sh
- /root
- a.sh
- # dirname $0 取得是路径
- # bashname $0 取得是名字
5):$# :获取当前传给脚本的所有参数的个数,一般用于控制参数个数,如例1.
- [root@centos6 ~]# cat a.sh
- echo $#
- [root@centos6 ~]# sh a.sh 1 2 3 4 5 6
- 6
- 例1:判断参数少于两个,就告诉报 脚本名加 "ARG1 ARG2" ,等于或大于两个参数时,显示钱两个参数
- [root@centos6 ~]# cat a.sh
- #!/bin/bash
- [ $# -ne 2 ] && {
- echo "$0 ARG1 ARG2"
- exit 1
- }
- echo $1 $2
- [root@centos6 ~]# sh a.sh
- a.sh ARG1 ARG2
- [root@centos6 ~]# sh a.sh 1 2
- 1 2
- # 脚本中的 exit 1 指的是返回值:如下例2
- 例2:
- [root@centos6 ~]# cat p.sh
- echo "123456789"
- exit 28
- [root@centos6 ~]# sh p.sh
- 123456789
- [root@centos6 ~]# sh p.sh ;echo $?
- 123456789
- 28
6):$? 命令执行的返回值,0表示没有错误,其他表示有错误
- [root@centos6 ~]# ls ; echo $?
- a.sh iptables.sh p.sh
- 0
- [root@centos6 ~]# 123 ; echo $?
- -bash: 123: command not found
- 127
- # 分号就是间隔符,表示前面和后面是两个命令的意思,执行完前一个,再执行后一个,两个命令没有任何依赖关系
5.4. 返回值代表意义:
- 0 :成功
- 1 或 2 :权限拒接,表示权限不足
- 1~125 :表示运行失败,脚本命令、系统命令错误或参数传递错误;
- 126 :找到命令了,但是无法执行
- 127 :命令找不到,
- 大于128的 :命令执行中退出
shell编程1:变量的使用与例子的更多相关文章
- Linux学习——shell编程之变量
shell编程之变量:Linux shell编程基础中的变量. 包括Bash变量的分类和各变量的详细使用,如:用户自定义变量.环境变量.语系变量.位置参数变量和预定义变量. 1:什么是Bash变量? ...
- Linux编程 21 shell编程(环境变量,用户变量,命令替换)
一.概述 这篇介绍shell的变量使用,跟其实语言一样,都有声明变量,使用变量,在shell中变量允许你临时地将信息存储中shell脚本中,以便和脚本的其他命令一起使用. 1.1 环境变量 在前面章节 ...
- Linux —— Shell编程之变量赋值和引用
Linux的shell编程是一种非常成熟的编程语言,它支持各种类型的变量.有三种主要的变量类型:环境变量.内部变量和用户变量. 环境变量(environment variable)是系统环境的一部分, ...
- Shell 编程 (变量和条件测试)
变量: 1 . 变量声明 直接使用变量 + 赋值 #!/bin/bash NAME='HELLO WORD' echo $NAME 使用 declare 关键字声明 declare(选项)(参数) + ...
- Shell编程-02-Shell变量
目录 什么是Shell变量 变量类型 环境变量初始化及其对应文件的生效顺序 什么是Shell变量 在初等数学数学方程式中,我们会经常碰到类似于这样的方程式:y=x+1 ,等号左右两边的x和y称 ...
- Linux Shell编程、变量、控制语句
为什么要学习Shell编程 1)Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理. 2)对于JavaEE和Python程序员来说,工作的需要,你的老大会要求你编写一些 ...
- linux shell编程之变量和bash配置文件(第一篇)
编程语言有两类 强类型:如C语言.数据具有其特定的类型,先声明定义后才能使用.数据运算时必须符合类型要求(如不能把字符串类型数据直接与整型数据做算数运算) 弱类型:如shell.数据默认为字符型,不用 ...
- SHELL编程概念&变量剖析
一.shell软件概念和应用场景 1) 学习Linux技术,不是为了学习系统安装.命令操作.用户权限.配置IP.网络管理,学习Linux技术重点:基于Linux系统部署和维护各种应用软件.程序(Apa ...
- 一、shell编程与变量
目录 命令是什么 命令是如何运行的: 基本语法 解释器 注释 如何执行 输入.输出流 重定向 管道符 | 变量 常见Shell变量的类型包括: 变量命名原则 单引号和双引号 反引号 变量作用范围 查看 ...
- Shell编程之变量进阶
一.变量知识进阶 1.特殊的位置参数变量 实例1:测试$n(n为1...15) [root@codis-178 ~]# cat p.sh echo $1 [root@codis-178 ~]# sh ...
随机推荐
- linux4.11内核设备编译时出现的问题(参考博客并更改的)
AllWinnerH3 linux4.11版本的bsp下载: https://pan.baidu.com/s/1mhU4a8K 密码: b375 H3-linux4.11_bsp目录就是所需的源码及编 ...
- Java--java中的基本数据类型以及对应的包装类
基本数据类型 序号 数据类型 长度(位数) 默认值 1 byte(整数型) 8 0 2 short(整数型) 16 0 3 int(整数型) 32 0 4 long(整数型) 64 0 5 float ...
- mysql模糊匹配like及批量替换replace
1.mysql 模糊匹配 like 与 not like 用法 : SELECT * FROM `user` where `nickname` LIKE '%测试%' SELECT * FROM `u ...
- HttpClient的userAgent和refer问题
HttpClient本质是模拟浏览器去请求网址,获取请求response. 为了更真实的模拟浏览器,不被限制,需要设置一些请求header. 如果是爬虫的话,老虑的会更多些,爬取网站在HttpClie ...
- SpringBoot项目后台对接微信支付开发——微信统一下单接口开发
开始没找到微信支付的sdk.自己根据官方给的接口文档纯手写,各种xml转JSON,JSON转xml,加密解密,签名....整个人都是崩溃的 开发的第三天,发现有官方的sdk.心情一下子豁然开朗,整个人 ...
- Django学习之视图层
视图层 小白必会三板斧 HttpResponse render redirect django视图函数必须要给返回一个HttpResponse对象(render和redirect内部返回的也是一个Ht ...
- 吴裕雄--天生自然python学习笔记:解决WebDriverException: Message: unknown error: missing or invalid 'entry.level'
会出现这个错误是因为你的chrome浏览器与下载的chromedriver.exe版本不一致造成的. 到这个地址:https://npm.taobao.org/mirrors/chromedriver ...
- python-django-redis拒绝连接问题解决_20191121
今天安装fastdfs的时候,发现最好固定虚拟机的ip, 固定了ip之后,发现使用Windows中的pycharm连接redis的时候,总是拒绝连接,找了很多的办法都不行,有点慌, 但是不能慌,现在要 ...
- plague|commence|gymnasium|triumph|jump
N-COUNT 瘟疫:疫病A plague is a very infectious disease that spreads quickly and kills large numbers of p ...
- [LC] 231. Power of Two
Given an integer, write a function to determine if it is a power of two. Example 1: Input: 1 Output: ...