美文网首页
shell 入门 01 变量

shell 入门 01 变量

作者: wjundong | 来源:发表于2022-09-18 17:52 被阅读0次
变量
date ; who

echo "This is a test to see if you're paying attention"
echo 'Rich says "scripting is easy".'
echo Rich says '"'This is a test to see if you"'"re paying attention'"'

# echo 不换行
echo -n "The time and date are: "; date

# 在脚本中,你可以在环境变量名称之前加上美元符($)来使用这些环境变量。echo 命令中的环境变量会在脚本运行时替换成当前值
echo UID: $UID 

# 只要脚本在引号中出现美元符,它就会以为你在引用一个变量, 输出 $ 本身需要进行转义
echo "The cost of the item is $15"

# 你可能还见过通过${variable}形式引用的变量。变量名两侧额外的花括号通常用来帮助识别美元符后的变量名。
# 在脚本的整个生命周期里,shell脚本中定义的变量会一直保持着它们的值,但在shell脚本结束时会被删除掉

shell脚本中最有用的特性之一就是可以从命令输出中提取信息,并将其赋给变量。把输出赋给变量之后,就可以随意在脚本中使用了。
有两种方法可以将命令输出赋给变量:

  • 反引号字符(`)
  • $()格式
# 变量 testing 获得了date命令的输出,然后使用echo语句显示出它的值。
testing=$(date)
echo "The date and time are: " $testing
# 这个脚本将日期值赋给一个变量,之后再将其作为文件名的一部分。
today=$(date +%y%m%d) 
ls /usr/bin -al > log.$today

命令替换会创建一个子shell来运行对应的命令。子shell(subshell)是由运行该脚本的shell所创建出来的一个独立的子shell(child shell)。正因如此,由该子shell所执行命令是无法使用脚本中所创建的变量的。在命令行提示符下使用路径./运行命令的话,也会创建出子shell;要是运行命令的时候不加入路径,就不会创建子shell。如果你使用的是内建的shell命令,并不会涉及子shell。在命令行提示符下运行脚本时一定要留心!

输入输出重定向

有些时候你想要保存某个命令的输出而不仅仅只是让它显示在显示器上。bash shell提供了几个操作符,可以将命令的输出重定向到另一个位置(比如文件)。重定向可以用于输入,也可以用于输出,可以将文件重定向到命令输入。

# 重定向输出 >, 重定向操作符创建了一个文件test6(通过默认的umask设置),并将date命令的输出重定向到该文件中。
date > test6 
# 追加 >>, 你可能并不想覆盖文件原有内容,而是想要将命令的输出追加到已有文件中
date >> test6 

# 重定向输入 <, wc命令可以对对数据中的文本进行计数, 输出: 行数 词数 字节数
wc < test6

# 内联输入重定向符号是远小于号(<<)。除了这个符号,你必须指定一个文本标记来划分输
# 入数据的开始和结尾。任何字符串都可作为文本标记,但在数据的开始和结尾文本标记必须一致。
# command << marker 
# data 
# marker 

wc << q
管道
# 有时需要将一个命令的输出作为另一个命令的输入。这可以用重定向来实现,只是有些笨拙
ls /bin > bin.list 
sort < bin.list
# 我们用不着将命令输出重定向到文件中,可以将其直接重定向到另一个命令。这个过程叫作管道连接(piping)。
# command1 | command2
# 不要以为由管道串起的两个命令会依次执行。Linux系统实际上会同时运行这两个命令,在
# 系统内部将它们连接起来。在第一个命令产生输出的同时,输出会被立即送给第二个命令。数据
# 传输不会用到任何中间文件或缓冲区。
ls /bin | sort
ls /bin | sort | more
ls /bin | sort > bin.list
执行数学运算

另一个对任何编程语言都很重要的特性是操作数字的能力。遗憾的是,对shell脚本来说,这
个处理过程会比较麻烦。在shell脚本中有两种途径来进行数学运算。

# 1. expr 命令方法
expr 5 + 2
expr 5 \* 2
# 要将一个数学算式的结果赋给一个变量,需要使用命令替换来获取expr命令的输出:
var1=10 
var2=20 
var3=$(expr $var2 / $var1) 
echo The result is $var3

# 2. 使用方括号
# bash shell为了保持跟Bourne shell的兼容而包含了expr命令,但它同样也提供了一种更简单的方法来执行数学表达式。
# 在bash中,在将一个数学运算结果赋给某个变量时,可以用美元符和方括号($[ operation ])将数学表达式围起来。
var1=$[1 + 5]
var2=$[$var1 * 2]
echo $var2
# 在使用方括号来计算公式时,不用担心shell会误解乘号或其他符号。shell知道它不是通配符,因为它在方括号内。\
# bash shell数学运算符只支持整数运算。若要进行任何实际的数学计算,这是一个巨大的限制
var3=$[10 / 3]
echo $var3

# 浮点型运算 zsh 集成有, bash 需要依赖外部命令, 例如 bc
var4=$(echo "scale=4; 10 / 3" | bc)
echo $var4

# bc 命令能识别输入重定向, 允许你将一个文件重定向到 bc 命令来处理。但更好的方法是使用内联输入重定向
# variable=$(bc << EOF 
# options 
# statements 
# expressions 
# EOF 
# )

# 你可以在bash计算器中赋值给变量。这一点很重要:在bash
# 计算器中创建的变量只在bash计算器中有效,不能在shell脚本中使用。
var1=10.46
var2=43.67
var3=33.2
var4=71
var5=$(bc << EOF 
scale = 4
a1 = ( $var1 * $var2)
b1 = ($var3 * $var4)
a1 + b1
EOF
)
退出脚本
# 查看退出码
date
echo $?
# 无效命令会返回一个退出状态码127
asdasd
echo $?
# 退出状态码126表明用户没有执行命令的正确权限。
./myprog.c 
echo $?

# 默认情况下,shell脚本会以脚本中的最后一个命令的退出状态码退出
# 你可以改变这种默认行为,返回自己的退出状态码。exit命令允许你在脚本结束时指定一个退出状态码。
exit 1
exit $var
# 由于退出码 0~255, 300 最后输出是 44. shell通过模运算得到这个结果
exit 300

相关文章

  • shell 入门 01 变量

    变量 shell脚本中最有用的特性之一就是可以从命令输出中提取信息,并将其赋给变量。把输出赋给变量之后,就可以随意...

  • Shell 概述

    学习 Shell 主要包括的内容: Shell 脚本入门 Shell 变量 Shell 内置命令 Shell 运算...

  • Bash shell

    Shell脚本编程30分钟入门 1. $开头shell变量的含义: $1, $2, $3, ... are the...

  • Shell入门03 -- 变量

    变量:用一个固定的字符串去表示不固定的内容; 自定义普通变量 定义变量:变量名=value,可使用驼峰命名法,但不...

  • shell基础在工作中的应用

    shell编程基础:1. shell变量:环境变量、特殊变量、用户自定义变量2. shell输入输出3 shell...

  • Linux Shell:基础知识和Shell变量

    摘要:Linux,Shell 整理Shell内容要点: Shell基础知识 Shell变量的类型 Shell变量赋...

  • 01-Shell 变量

    1. 定义变量 定义变量时,变量名不加美元符号($,PHP语言中变量需要),如: 注意,变量名和等号之间不能有空格...

  • bash 变量类型

    2021-01-12 变量分类:预定义变量、环境变量、自定义变量、位置变量 1.预定义变量:在shell一开始就定...

  • Shell常用命令(md格式方便阅读和复制粘贴)

    Shell Shell中的变量 系统变量 自定义变量 自定义变量规则 Shell特殊变量 运算符 条件判断 基本语...

  • shell第11章shell脚本

    什么是shell? Bash shell: 什么是shell脚本? 变量的介绍: 普通变量介绍: 环境变量介绍: ...

网友评论

      本文标题:shell 入门 01 变量

      本文链接:https://www.haomeiwen.com/subject/idbportx.html