1. 变量类型

按变量使用范围

  • 局部变量:在脚本或命令中定义,尽在当前shell实例中有效,其他shell启动的程序不能访问局部变量
  • 环境变量:所有的程序,包括shell启动的程序,都能访问变量。有些程序需要环境变量来保证其正常运行
  • shell变量:shell变量是由shell程序设置的特殊变量。有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。

按变量类型可以分为:字符串、数组、布尔

2.定义变量

2.1 变量名命名规则

  • 1.命名只能使用英文字母、数字和下划线,首个字符不能以数字开头
  • 2.中间不能有空格,可以使用下划线
  • 3.不能使用标点符号
  • 4.不能使用sh中的关键字,可用help查看保留字

2.2 定义变量

  • 1.= 两边不能有空格 a=1
  • 2.如果内容有空格,需要使用单引号或双引号 c="hello world"; d='hello singleDog';
  • 3.双引号支持转义,$开头的变量会被自动替换
  • 4.单引号不知转义,$开头的变量会原样输出,不会被替换
  • 5.显式直接赋值:a=1,a_=2
  • 6.用语句赋值:for file in `ls /etc`,for file in $(ls /etc)
#双引号支持转义,$开头的变量会被自动替换
#单引号不知转义,$开头的变量会原样输出,不会被替换
a=1
b=helloworld
c="hello\tworld${a}"
d='hello\tworld${a}'
echo $c #hello world1
echo $d #hello world${a} #用语句赋值: ` ` 和 $() 等价
for file in $(ls /Users/csj/Desktop);do
echo ${file} # 打印/Users/csj/Desktop目录下的文件
done

3.使用变量

3.1 访问变量

* 在变量前面加上$即可引用变量,如$b。对于变量名较长的变量,使用花括号,如${ab_0ui},会更严谨。
* 变量不定义也可以使用,引用未定义的变量,默认为空值。
* 已定义的变量可以重新定义

```#shell
#!/bin/sh
your_="zhangsan"
your_name="hello world"
echo $your_name #hello world
echo ${your_name} #hello world
# 已定义的变量可以重新定义
your_name="hello java"
echo ${your_name} #hello java
```

3.2 将变量用作数组

#!/bin/bash
your_name="hello world"
for i in ${your_name};do
echo "this is $i" #this is hello;this is world
done

3.3 预定义变量

PWD USER HOME PATH

3.4 只读变量

使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变。

#!/bin/bash
your_name="hello world"
echo ${your_name} # hello world
readonly your_name
your_name="hello java"
echo ${your_name} # test.sh: line 5: your_name: readonly variable

3.5 删除变量

使用unset可以删除变量

#shell
#!/bin/bash
your_name="hello world"
unset your_name
echo ${your_name}

运行脚本,将不会有任何输出

4.数字变量操作

a=1
echo ${a} # 1
echo $((a+1)) # 2
echo $((a*3)) #3
echo $((a-2)) #-1
echo $((a/3)) #取商的整数位0

除法和浮点数计算使用awk

#!/bin/sh
a=1
awk 'BEGIN{print 1/3}' # 0.333333

5.字符串变量操作

5.1 单引号字符串的限制

  • 1.单引号的任何字符串都会原样输出,单引号字符串中的变量是无效的;
  • 2.单引号字符串中不能出现单独的单引号,对单独的单引号使用转译符也不行
#!/bin/sh
#单引号内可以添加转译符、双引号
your_name='hello world'
echo '单引号中变量无效${your_name}' # 单引号中变量无效${your_name}
echo '可以单个双引号:hello"' # 可以单个双引号:hello"
echo '可以成对的双引号:h"e"llo' # 可以成对的双引号:h"e"llo
echo '多个用于拼接字符串:''hello''wrold' # 多个用于拼接字符串:hellowrold
echo '可以使用转译符:\thello\nworld' # 可以使用转译符: hello 此处换行world
echo '不能使用单独的单引号:\'hello' # unexpected EOF while looking for matching `'';syntax error: unexpected end of file

5.2 双引号的优点:

  • 1.双引号里可以有变量
  • 2.双引号里可以出现针对双引号进行转译
#!/bin/sh
your_name="Tom Cat"
echo ${your_name} # Tom Cat
echo "hello \"${your_name}\"" # hello "Tom Cat"

5.3 拼接字符串

#!/bin/sh
your_name="Tom Cat"
#使用双引号进行拼接,变量在双引号内部,变量在双引号外面
hello1="hello,"$your_name"!"
hello2="hello,${your_name}!"
echo $hello1 #hello,Tom Cat!
echo $hello2 # hello,Tom Cat!
#使用单引号,变量在单引号内部,变量在单引号外面
hello3='hello,'$your_name'!'
hello4='hello,${your_name}!'
echo ${hello3} # hello,Tom Cat!
echo ${hello4} # hello,${your_name}!

5.4 获取字符串长度 ${#string}

#!/bin/sh
your_name="Tom Cat"
echo ${#your_name} #7 打印字符串长度
echo ${#your_name[@]} #1 将变量视为一个数组,打印数组中元素的个数
echo ${#your_name[*]} #1

5.5 查找子字符串

expr index "${string}" substring

#shell
#!/bin/sh
string="hello world"
echo `expr index "$string" o` # mac没有执行成功,expr: syntax error

5.6 字符串截取

  • # 最短匹配左截取,删除左起第一个及左边的字符,保留右边字符
  • ## 最长匹配左截取,删除左起最后一个及左边的字符,保留右边字符
  • % 最短匹配右截取,删除右起第一个及右边的字符,保留左边字符
  • %% 最长匹配右截取,删除右起最后一个及右边的字符,保留左边字符
  • / 最短匹配左替换,替换左起第一个匹配的字符
  • // 最长匹配左替换,替换全部匹配的字符
  • ${str:offset:length}从左起第几个字符开始,及截取字符的个数
  • ${str:offset}从左起第几个字符开始,一直到结束
  • ${str:0-start:length}从右边第几个字符开始,及字符的个数
  • ${str:0-start}从右边第几个字符开始,一直到结束
#!/bin/sh
str='Hello World'
echo $str # Hello World
echo ${str#*o} #第一个o World
echo ${str##*o} #最后一个o rld
echo ${str%o*} #从右往左第一个o Hello W
echo ${str%%o*} #从右往左最后一个o Hell
echo ${str/o/z} # 左起第一个o Hellz World
echo ${str//o/z} #全部o Hellz Wzrld
echo ${str/#*o/z} # zrld
echo ${str/%o*/z} # Hellz
echo ${str:2:3} # llo
echo ${str:3} # lo World
echo ${str:0-5:3} # Wor
echo ${str:0-3} # rld xx="1234537"
echo ${xx:2:3} #345 取字符串,范围从第2个字符开始,取3个字符
echo ${xx/3/c} #12c4567 将每行第一个3替换成c
echo ${xx##*3} #7 左起,取最后一个3后面的内容
echo ${xx%%5*} #1234 尤其,取最后一个5前面的字符 echo $xx|awk '{print substr($0,2,3)}' #234 取字符串的第二个字节开始的3个字符,注意:不是索引
echo $xx|sed 's#3#c#g' #12c45c7 将所有的3替换为c

6.布尔变量

  • true
  • false
  • 命令执行返回值$? 任何命令执行都会有返回值。0表示正确,非0表示错误
a=true
b=false

7. 数组变量

使用()来定义数组变量,中间使用空格隔开

```#shell
array1=(1 3 4 6)
array2=(`ls`)
echo ${array1[2]} # 4 打印第3个元素
echo ${#array1} # 1 将数组视为一个元素
echo ${array1[*]} # 1 3 4 6 打印数组的全部元素
echo ${#array1[*]} #打印数组元素的个数
```
# 8. 特殊符号的使用
```#shell
# 双引号用于括起一段字符串值,支持${var}形式的变量替换
# 单引号页表示其内容是字符串值,不支持转译
# \反斜线,某些情况下用于转译
echo "hello\tworld" # hello world
# $(ls)表示执行ls后的结果,与``类似,不过可以嵌套;$( )的弊端是,并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的
for i in $(ls);do
echo $i # 列出当前目录下的所有文件和文件夹
done
# ``反引号,用法比较独特,代表命令的输出,非常有用
for i in `ls *py`;do
echo $i #列出当前目录下的所有py文件
done
# $(())对变量进行操作,比如相加$((a+b))
echo $((5+6)) #11
# (())是整数扩展,把里面的变量当作整数取处理
a=4;((a++));echo $a #5
# {1..10}等价于seq 1 10表示1到10
for i in {1..3};do # for i in `seq 1 3`;do
echo ${i} # 1 2 3
done
```

shell 2变量的更多相关文章

  1. shell与变量的声明的操作

    1.给命令起别名:alias 执行下面命令后,可以使用dir代替ls –l 命令,显示目录中的文件详细信息: 还可以用一个别名表示几个命令 的结合: 2.ps:显示当前登录会话的所有活动进程: 3.更 ...

  2. shell之变量与read

    环境变量 set 环境变量可供shell以外的程序使用 shell变量 env shell变量仅供shell内部使用 set:显示(设置)shell变量 包括的私有变量以及用户变量,不同类的shell ...

  3. 【Linux】之shell特殊变量整理

    目录 1. 特殊变量列表 2. 特殊说明 在shell中变量名只能包含数字.字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量. 例如,$ 表示当前Shell进程的ID,即p ...

  4. (转载)shell变量基础—shell自定义变量

    (转载)http://see.xidian.edu.cn/cpp/html/1494.html 一.Shell定义变量需要遵循的规则 Shell编程中,使用变量无需事先声明,同时变量名的命名须遵循如下 ...

  5. shell基础——变量定义

    快速参考: 变量定义格式: 变量名=值 str1="hello world" # define a string var str2=hello # define a string ...

  6. shell的变量处理

    shell的变量处理 一.删除 删除(删除某一段) # 从前向后删除 % 从后向前删除 删除(删除某一部分) $(var:nu1:nu2) nu1表示开始位置 nu2表示删除长度 示例如下 file= ...

  7. shell 环境变量的相关配置文件和配置方法

    shell 环境变量的相关配置文件和配置方法: bash 的配置文件: 全局配置: /etc/profile, /etc/profile.d/*.sh, /etc/bashrc 个人配置 ~/.bas ...

  8. Linux编程 12 (默认shell环境变量, PATH变量重要讲解)

    一 .概述 默认情况下, bash shell会用一些特定的环境变量来定义系统的环境.这些默认环境变量可以理解是上篇所讲的系统全局环境变量. 1.1 bash  shell支持的Bourne变量 Bo ...

  9. shell模板变量替换

    我们经常使用一些模板语言来处理一些变量替换.比如jsp,php,velocity,freemarker,thymeleaf等.那对于shell来说,应该怎样替换变量呢.有一种很简单的办法可以做到. 先 ...

  10. centos shell编程5 LANMP一键安装脚本 lamp sed lnmp 变量和字符串比较不能用-eq cat > /usr/local/apache2/htdocs/index.php <<EOF重定向 shell的变量和函数命名不能有横杠 平台可以用arch命令,获取是i686还是x86_64 curl 下载 第三十九节课

    centos shell编程5  LANMP一键安装脚本 lamp  sed  lnmp  变量和字符串比较不能用-eq  cat > /usr/local/apache2/htdocs/ind ...

随机推荐

  1. iOS工程中如何去掉第三方的警告

    一)第一种方法 在工程中有警告的地方,右键选择Review in log,然后就能看到类似[Wnonnull]这样的警告, 然后在工程buildSettings中的Other Warning Flag ...

  2. 入门级:理解FAT32文件系统(转载翻译)

    FAT(File Allocation Table ) 这个网页的目的是帮助你理解怎么样在微软FAT32文件系统下取得数据,处理的硬盘的大小通常在500M到几百G之间.FAT是一个相对简单和纯净的文件 ...

  3. 图片预加载 js css预加载

    图片预加载, 效果非常明显, 特别是有多个图, 方法很简单 , 体验提升了不少 <div class="hidden">        <script type= ...

  4. 子域名爆破&C段查询&调用Bing查询同IP网站

    在线子域名爆破 <?php function domainfuzz($domain) { $ip = gethostbyname($domain); preg_match("/\d+\ ...

  5. 中国教授在BlackHat现场演示破解SIM卡AES-128加密

    使用一个PC和示波器克隆3G/4G SIM卡,破解过程只需十分钟.上海交大教授郁昱现场展示了如何成功复制SIM卡,以及一张克隆卡如何变更了支付宝的密码并潜在盗取账户资金. 破解SIM卡加密 今年二月, ...

  6. vim/vi用法总结

    第一章:安装: 在命令行运行vim,如果找不到程序,需要自己安装. 1.1 下载 从官方网站ftp://ftp.vim.org/pub/vim/unix/中选择一个版本下载,我这里使用的是vim-7. ...

  7. ROS功能包- rrt_exploration

    一种基于RRT实现的多机器人地图探测算法的ROS软件包. 它还具有使用图像处理提取边界点.基于图像的边界检测等功能. 适用版本:indigo.jade.kinetic.lunar. 注意事项:官网文档 ...

  8. BZOJ3757: 苹果树【树上莫队】

    Description ​ 神犇家门口种了一棵苹果树.苹果树作为一棵树,当然是呈树状结构,每根树枝连接两个苹果,每个苹果都可以沿着一条由树枝构成的路径连到树根,而且这样的路径只存在一条.由于这棵苹果树 ...

  9. UVA 156:Ananagrams (vector+map+sort)

    题意:一大堆单词中间有空格隔开,以'#'结束输出,问只出现一次的的单词有哪些(如果两个具有相同的长度,相同的字母也算是相同的,不区分大小写,如:noel和lone属于一个单词出现两次).最后按照字典序 ...

  10. Fzu软工第一次作业-准备篇

    (0)一些想说的话 我叫陈浩,是16级计算机一个很普通的学生.我是补选选软工实践这门课的.选软工实践这门课我想了很久.因为学长学姐告诉我这是一门很锻炼人又很辛苦的课程,需要大量的时间和精力.然而如今的 ...