shell 入门 01 变量

2022-09-18  本文已影响0人  wjundong
变量
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
上一篇 下一篇

猜你喜欢

热点阅读