Bash Shell脚本编程-变量知识
Shell:GUI CLI
提供交互式接口:提高效率
命令行展开:~ ,{}
命令别名:alias
命令历史:history
Globbing:*,?,[],[^]
命令补全:$PATH指定的目录下
路径补全:TAB键
管道:|
输入输出重定向:> >>
提供编程环境:
bash自动运行脚本机制
面向过程(以指令为中心组织数据)的编程模型
脚本编程
输入指令解决问题
程序是语句和表达式组成的
运行时根据一定流程来执行:
顺序执行
选择执行
循环执行
程序是指令+数据的
面向对象(以数据为中心来组织指令)
框架组织程序中的各个指令
程序运行模型:
编译运行:
源程序——>预处理——>编译——>汇编——>链接——>运行
# file /bin/cat
/bin/cat: ELF 64-bit LSB executable, x86-64, version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
# ldd /bin/cat 链接到的库
linux-vdso.so.1 => (0x00007fff5c3ff000)
libc.so.6 => /lib64/libc.so.6 (0x00000035d0e00000)
/lib64/ld-linux-x86-64.so.2 (0x00000035d0600000)
解释运行:
向内核提出运行要求时是解释器运行成进程
源程序——>无需编译——>解释器——>内核根据文件的格式来判定可执行(脚本的第一行要写入shebang,如#!/bin/bash)——>让bash程序来执行
变量:命名的内存空间
变量名:存放在内存中,由解释器和内存自行维护
变量值:存放在内存中,由用户来维护
数据类型:127:01111111 7bit存储空间
127:1,2,7,是字串,要24位来存储
ASCII码:0-9,a-z,A-Z,punction
0-127 ,128种变化,要7位就能存储
0000 0000 - 0111 1111
1.定义了数据存储格式
2.定义了数据表示范围
3.定义数据可以参与的运算类型
强类型编程语言:严格区分类型
弱类型编程语言:不严格区分类型
bash:把所有值都默认当作字符存储
类型:
数值型:
精确数值型:整数
近似数值型:float(单精度浮点),double(双精度浮点)
计算机里面有专门的浮点单元来进行
浮点数的存储格式?
字符型:
单个字符,字符串string
布尔型:
true,false
逻辑运算:
与:1&&1=1
1&&0=0
0&&1=0
0&&0=0
或:
1 || 1 =1
1 || 0 =1
0 || 1 =1
0 || 0 =0
非:
!1 =0
!0 =1
异或:
1 异或 1 =0
1 异或 0 =1
bash的变量类型:
本地变量:只对当前shell进程有效,对当前之外的其他shell等shell都无效。
环境变量:对当前shell进程及其子shell进程有效,对其他shell无效。
局部变量:仅对当前shell进程中的某段代码空间内有效,通常用于函数本地程序。
位置变量:$1 , $2 ,。。。
特殊变量:$?,$0 ,$$ ,$# ,$* , $@
$# 传递到脚本的参数个数
$* 传递到脚本的参数,与位置变量不同,此选项参数可超过9个
$$ 脚本运行时当前进程的ID号,常用作临时变量的后缀,如 haison.$$
$! 后台运行的(&)最后一个进程的ID号
$@ 与$#相同,使用时加引号,并在引号中返回参数个数
$- 上一个命令的最后一个参数
$? 最后命令的退出状态,0表示没有错误,其他任何值表明有错误
本地变量:只是在用户当前shell生存期的脚本中使用
无需事先声明可直接使用
变量赋值:# VAR_NAME=
变量引用:#echo "${VAR_NAME}"
[root@localhostretry]# a=1 [root@localhostretry]# echo "a=$a" a=1 [root@localhostretry]# b='2' [root@localhostretry]# echo "b=$b" b=2 [root@localhostretry]# c="3" [root@localhostretry]# echo "c=${c}" c=3 [root@localhostretry]# a=1-$a [root@localhostretry]# echo "a=$a" a=1-1 [root@localhostretry]# b='2-$a' [root@localhostretry]# echo "b=$b" b=2-$a [root@localhostretry]# c="3-$a" [root@localhostretry]# echo "c=${c}" c=3-1-1
#echo $username#username=jerry #echo $username jerry # echo '$username' 强引用,其中变量会被替换,所见所得 $username # echo "$username" 弱引用,其中变量不会被替换 jerry #set 显示本地变量 #unset VAR_NAME 撤销变量 #username=slackware #useradd $username #echo $username |passwd --stdin $username Changingpassword for user slackware. passwd:all authentication tokens updated successfully.
注意习惯:
1.数字不加引号,其他默认加双引号
2.把命令作为变量:反引号
CMD=`ls`
3.${WEEK}day 若变量和其他字符组成新的变量就必须给变量加上大括号。
4.养成将所有字符串变量用双引号括起来的使用习惯,将会减少很多编程中遇到的错误。如 "$A" 或 "${A}"
特殊例子:awk调用shell变量引号例子
[root@localhostretry]# NUM=123 [root@localhostretry]# awk 'BEGIN {print '$NUM'}' 123 [root@localhostretry]# awk 'BEGIN {print "$NUM"}' $NUM
环境变量:
环境变量用于定义shell的运行环境,保证shell命令的正确执行,shell通过环境变量确定登录用户名,命令路径,终端类型,登录目录等,所有的环境变量都是系统全局变量,可用于所有子进程。
无需事先声明
$USER
$HOME
$UID
$SHELL
$PATH
变量赋值:
#export VAR_NAME=VALUE
#declare -x VAR_NAME=VALUE
变量引用:${VAR_NAME}
注意:bash内建了许多环境变量
显示环境变量
#export
#printenv
#env
#export username 导出为环境变量
#unset VAR_NAME 撤销变量临时生效
变量只读:
readonly VAR_NAME
declare -r VAR_NAME
退出当前shell进程可撤销
变量命名规则:
1.不能使用程序中的关键字
2.只能使用数字,字母或者下划线,而且不能以数字开头
3.见名知意:username,userName,_
自定义环境变量生成环境JAVA环境配置实例:tomcat,resin,csvn,hadoop
export JAVA_HOME=/application/jdk export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin export RESIN_HOME=/application/resin
常见放在: /etc/profile 或者 /etc/
位置变量:
#scirpt1.sharg1 arg2…
$0,$1…${10}
算术运算:
letVAR=expression
$[epression]
$((epression))
'expr arg1 arg2 arg3'
计算整数之和
#vi test.sh #!/bin/bash#author:testdeclare -i sum=0sum=$[$1+$2]echo "the sum of $1 and $2:$[$1+$2]echo "the minus of $1 and $2:$[$1-$2]
参数变量的轮替:
shift [n]
#vi test2.sh #!/bin/bash#author:test#echo $1shift#echo $1shift#echo $1shift
特殊变量:
$0:获取当前执行的shell脚本的文件名,包括路径
#cat 14.sh dirname $0basename $0#sh /root/14.sh/root14.sh
$n:获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9后,用大括号括起来${10}
#seq 7 |sed 's#[0-9]#$&#g' #cat 13.sh#!/bin/bashecho$1 $2 $3 $4 $5 $6 $7 $8 $9 $10#sh 13.sh 1 2 312 3 10
$#:获取当前shell命令行参数的总个数
#cat 13.sh #!/bin/bashecho$1 $2 $3 $4 $5 $6 $7 $8 $9 $10echo$##sh 13.sh 1 2 3 4 512 3 4 5 105#sh 13.sh "1 2 3 45"12 3 4 5 1 2 3 4 501
$@:这个程序的所有参数"$1" "$2" "$3" … ,这是将参数传递给其他程序的最佳方式,因为它会保留所有内嵌在每个参数里面的任何空白。
$*:获取当前shell的所有参数,将所有的命令行参数视为单个字符串,相当于"$!$2$3"…
echo 'total $#' echo -e '$@\n'echo -e '$*\n'
进程状态变量:
$$:获取当前shell的进程号PID
#!/bin/bash echo$$ >/root/pid.logwhiletrue ; douptime &>/dev/nullsleep 2done#sh 15.sh &[1]3158#cat pid.log3158
$!:获取上一个指令的PID
$?:获取执行的上一个指令的状态码(0为成功,非0失败)
例如:编译安装程序时,make后查询成功与否
make
echo $?
打包时也可以使用
$?返回值参考:
0:表示运行成功
2:权限拒绝
1-125:表示运行识别,脚本命令,系统命令错误或参数传递错误
126:找到命令,但无法执行
127:未找到要运行的命令
>128:命令被系统强制结束
$_ :在此之前执行的命令或脚本的最后一个参数
练习:写一个脚本,能接受一个参数,此参数用于用户名
1.创建此用户
2.给用户添加密码,密码同用户名
#!/bin/bash #author:testuseradd$1 echo$1 |passwd --stdin $1
练习:写一个脚本,能接受一个参数,此参数为系统上某文本文件路径
1.显示此文件的总行数
2.统计此文件中的空白行数
#!/bin/bash wc-l $1 |cut -d' ' -f1grep'^[[:space:]]$' $1 |wc -l
$*和$@的区别:
$*:将所有命令行所有参数视为单个字符,等同于"$1$2$3"
$@:将命令行每个参数视为单独的字符串,等同于"$!" "$2" $3" ,这是将参数传递给其他程序的最佳方式,因为它会保留所有内嵌在每个参数里的任何空白。
[root@localhost ~]# set -- "how old " are you. 传入3个参数 [root@localhost ~]# echo $# 现在有三个参数3[root@localhost ~]# for i in $* ; do echo $i ; done循环打印参数,用$*,howoldareyou.[root@localhost ~]# for i in $@ ; do echo $i ; done没有双引号情况howoldareyou.[root@localhost ~]# for i; do echo $i ; done 去掉in变量列表,相当于in"$@"howoldareyou.[root@localhost ~]# for i in "$@" ; doecho $i ; done 在有双引号的情况下,参数里引号内容当作一个参数输出,这才真正符合我们传入的参数需求。howoldareyou..
获取系统运行级别:
# runlevel=$(set -- $(runlevel);eval "echo \$$#" ) # echo $runlevel3
1. eval command-line
其中command-line是在终端上键入的一条普通命令行。然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次。如:
pipe="|"
evalls $pipe wc -l
shell第1次扫描命令行时,它替换出pipe的值|,接着eval使它再次扫描命令行,这时shell把|作为管道符号了。
如果变量中包含任何需要shell直接在命令行中看到的字符(不是替换的结果),就可以使用eval。命令行结束符(;| &),I/o重定向符(< >)和引号就属于对shell具有特殊意义的符号,必须直接出现在命令行中。
2. eval echo \$$# 取得最后一个参数
如:cat last
evalecho \$$#
./lastone two three four
four
第一遍扫描后,shell把反斜杠去掉了。当shell再次扫描该行时,它替换了$4的值,并执行echo命令
3.以下示意如何用eval命令创建指向变量的“指针”:
x=100
ptrx=x
eval echo \$$ptrx 指向ptrx,用这里的方法可以理解b中的例子
100 打印100
eval $ptrx=50 将50存到ptrx指向的变量中。
echo$x
50 打印50
转载于:https://blog.51cto.com/sohudrgon/1586794
相关文章:

FFmpeg中可执行文件ffplay用法汇总
从https://ffbinaries.com/downloads 下载最新的4.1版本的windows 64位FFplay。目前linux下的只有3.2版本的。FFplay是一个由FFmpeg和SDL库组成的简单媒体播放器,它主要用作各种FFmpeg API的测试。 通过执行以下命令将FFplay信息重定位到ffplay_help.txt文件中便于…
用Go重构C语言系统,这个抗住春晚红包的百度转发引擎承接了万亿流量
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100)11 月 20 日,百度的万亿流量转发引擎 BFE 登上了 GitHub Trending Top 3,今日 Star 已突破 270。事实上,这个曾经抗住 2019 年春晚抢红包的转发引擎早已于 2019 年夏在 G…

Swift3.0带来的变化汇总系列一——字符串与基本运算符中的变化
var string "Hello-Swift" //获取某个下标后一个下标对应的字符 char"e" //swift2.2 //var char string[startIndex.successor()] //swift3.0 var char string[string.index(after: startIndex)] //获取某个下标前一个下标对应的字符 char2 "t&qu…

vc+如何添加右键弹出菜单
2019独角兽企业重金招聘Python工程师标准>>> 一、创建新工程 二、编辑菜单资源 1、添加菜单 按“CtrlR”,双击“Menu”图标2、于菜单编辑器内编辑菜单四、添加代码(红色部分) void CCMenuView::OnUpdateShow(CCmdUI* pCmdU…
EMNLP 2019 | 大规模利用单语数据提升神经机器翻译
BDTC大会官网:https://t.csdnimg.cn/q4TY作者 | 吴郦军、夏应策来源 | 微软研究院AI头条(ID:MSRAsia)编者按:目前,目标语言端的无标注单语数据已被广泛应用于在机器翻译任务中。然而,目标语言端的无标注数据…

swift 3.0 json解析、字典转模型三种方案
swift3.0发布有一段时间了,发现很多朋友在swift3.0json解析上上遇到很多问题,我这边为大家提三种常见的json方案。 1.第一种是自带的字典转模型,自带的需要实现系统的setValue方法,然后自己还要实现dictToModel方法即可解析&…

海思3559A上编译GDB源码操作步骤及简单使用
1. 从http://ftp.gnu.org/gnu/gdb/ 下载最新稳定版8.3,即gdb-8.3.tar.gz,解压缩; 2. 在gdb-8.3目录下,创建一个build.sh脚本文件,内容如下: ./configure \--prefix"$PWD/install" \--targetaar…

Hibernate之继承映射
Hibernate的继承映射可以理解为两个持久化类之间的继承关系 例如老师和人之间的关系 持久化类 Person类 public class Person { private Integer id; privvate String name; private String sex; public Person (){} // 无参构造器 p…
AutoML未来可期,工程师的明天何去何从?
人工智能和机器学习建模专业技术人才紧缺,即使是高水平的人工智能专家,在大数据智能分析机器学习建模时,主要依靠人工经验,建模过程费时费力,缺少有效方法。为了解决这一突出问题,国内外出现了一种用机器学…

海思3559A上编译Valgrind源码操作步骤
注:按照以下步骤可以在海思板子上正常编译valgrind源码并生成valgrind可执行文件,但可能还不能在海思板子上正常使用。 1. 从http://valgrind.org/downloads/?srcwww.discoversdk.com 下载Valgrind 3.15.0即valgrind-3.15.0.tar.bz2; 2. 在valgrind-3…

Swift之SDWebImage第三方框架
在学习Swift过程中,最害怕的使用了OC的第三方框架 好不容易配置成功了,却出现了意外的Bug [UIImageView setImageWithURL:]: unrecognized selector sent to instance解决办法 第一次配置的时候,因为百度了教程,所以一次性成功…

文件分区格式化及挂载
创建一个5G的分区,文件系统为ext2,卷标为DATA,块大小为1024,预留管理空间为磁盘分区的8%;挂载至/backup目录,要求使用卷标进行挂载,且在挂载时启动此文件系统上的acl功能;在虚拟机创…

iOS开发swift版异步加载网络图片(带缓存和缺省图片)
iOS开发之swift版异步加载网络图片 与SDWebImage异步加载网络图片的功能相似,只是代码比较简单,功能没有SD的完善与强大,支持缺省添加图片,支持本地缓存。 异步加载图片的核心代码如下: func setZYHWebImage(url:NSStr…
2097352GB地图数据,AI技术酷炫渲染,《微软飞行模拟器》游戏即将上线
整理 | 若名出品 | AI科技大本营(ID:rgznai100)“只要是真实存在的地方,你都能抵达。”作为即将成为第一款将整个地球化作虚拟世界来供玩家玩的游戏,微软的《微软飞行模拟器》(Microsoft Flight Simulator)…

开源库nothings/stb的介绍及使用(图像方面)
GitHub上有个开源的stb库,Star数已过万,地址为https://github.com/nothings/stb,为何叫stb,是用的作者名字的缩写Sean T. Barrett。此库仅包含头文件,除stretchy_buffer.h外,其它所有文件以前缀stb开头&…

git stuff
git stuff trick git bash 无法标记复制解决办法 git bash窗口左上角图标点击,选择属性->选项->快速编辑模式 确定就ok了 Usual Commands 创建分支git branch branch-namegit push origin branch-name 删除分支git branch -r -d origin/branch-name 删除远程分支git push…

swift3.0之闭包
Swift 相比原先的 Objective-C 最重要的优点之一,就是对函数式编程提供了更好的支持。 Swift 提供了更多的语法和一些新特性来增强函数式编程的能力,本文就在这方面进行一些讨论。 Swift 概览 对编程语言有了一些经验的程序员,尤其是那些对多…

Linux下gdb attach的使用(调试已在运行的进程)
在Linux上,执行有多线程的程序时,当程序执行退出操作时有时会遇到卡死现象,如果程序模块多,代码量大,很难快速定位,此时可试试gdb attach方法。 测试代码main.cpp如下,这里为了使程序退出时产生…
一行Python代码能实现这么多丧心病狂的功能?(代码可复制)
最近看知乎上有一篇名为《一行 Python 能实现什么丧心病狂的功能?》(https://www.zhihu.com/question/37046157)的帖子,点进去发现一行Python代码可以做这么多丧心病狂的功能!整理了一下知乎上这篇文章的内容ÿ…

一步一步写算法(之图结构)
原文:一步一步写算法(之图结构) 【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 图是数据结构里面的重要一章。通过图,我们可以判断两个点之间是不是具有连通性…

FFmpeg中可执行文件ffprobe用法汇总
从https://ffbinaries.com/downloads 下载最新的4.1版本的Windows 64位FFprobe,FFprobe用于从多媒体流中获取相关信息或查看文件格式信息,并以可读的方式打印,FFprobe可以作为一个命令行程序单独使用。 通过执行以下命令将FFprobe信息重定位…

CocoaPods导入的库其头文件导入的方法
尽管CocoaPods使用十分方便,但其导入的第三方框架还是要经过几步操作,才能供项目使用; 第一步:导入库 1>-在终端进入项目的根目录; 2>-输入:touch Podfile,则项目文件夹会创建一个空的Podfile,这时,你可以将你想要导入的库写在里面.如: platform :ios, 6.0 pod RESid…
Google、微软、阿里、腾讯、百度这些大公司在GitHub上开源投入排名分析 | CSDN原力计划...
扫码参与CSDN“原力计划”作者 | 村中少年来源 | CSDN原力计划获奖作品现在有越来越多的公司都参与了开源,其背后有各自的目的所在,姑且不予讨论。本文是从多个方面分析各大公司在开源上的投入情况。由于全世界绝大多数的开源项目都有发布到Github上&…

jquery源码解析:each,makeArray,merge,grep,map详解
jQuery的工具方法,其实就是静态方法,源码里面就是通过extend方法,把这些工具方法添加给jQuery构造函数的。 jQuery.extend({ ...... each: function( obj, callback, args ) { //$.each(arr , function(i,value){}),第三个参数用于…

swift实现提示框第三方库:MBProgressHUD
GitHud的下载地址是:https://github.com/jdg/MBProgressHUD/ 下载完成后,将MBProgressHUD.h和MBProgressHUD.m拖入已经新建好的Swift项目。因为使用的swift语言,所以拖入项目的时候会提示是否新建一个桥接objective-c与swift的文件ÿ…
这段Python代码让程序员赚300W,公司已确认!网友:神操作!
Python到底还能给人多少惊喜?笔者最近看到了这两天关于Python最热门的话题,关于《地产大佬潘石屹学Python的原因》,结果被这个回答惊到了:来源:知乎 https://www.zhihu.com/question/355880221笔者翻了翻那些回答&…

FFmpeg中可执行文件ffmpeg用法汇总
从https://ffbinaries.com/downloads 下载最新的4.1版本的Windows 64位FFmpeg,FFmpeg是一个快速的音频/视频转换工具,FFmpeg可以作为一个命令行程序单独使用。 通过执行以下命令将FFmpeg信息重定位到ffmpeg_help.txt文件中便于查看,其内容如…

下载Ext JS 5.1 gpl版本的方法
先进入官网:http://www.sencha.com然后在导航的Products中选择Sencha Ext JS,会看到以下页面:这时候不要单击Download按钮,而是要单击导航中的DETAILS,页面切换后,就可在底部看到GPL版本的下载按钮了&#…

对MBProgressHUD进行封装并精简使用
几个效果图: 以下源码是MBProgressHUD支持最新的iOS8的版本,没有任何的警告信息 MBProgressHUD.h 与 MBProgressHUD.m MBProgressHUD.hMBProgressHUD.m以下是本人在MBProgressHUD基础上封装的类,觉得部分的使用基于block ShowHUD.h 与 Show…

基于Hash的消息认证码HMAC简介及在OpenSSL中使用举例
HMAC(Hash-based Message Authentication Code):基于Hash的消息认证码,是一种通过特别计算方式之后产生的消息认证码(MAC),使用密码散列函数,同时结合一个加密密钥。它可以用来保证数据的完整性,同时可以用来作某个消息…