shell脚本中的数学运算,重定向,alias

1. 整数运算:


#!/bin/bash
num1=4
num2=5


let result1=num1+num2
echo $result1


let num1++
let num2--


result2=$[ num1 + num2 ]


result3=$[ $num1 + 10 ]


echo $result2
echo $result3






result4=`expr 3 + 4`
echo $result4


2. 文件描述符和重定向


 0 —— stdin(标准输入)。
 1 —— stdout(标准输出)。
 2 —— stderr(标准错误)。


在命令执行之后立刻运行echo $?,就可以打印出退出状态


你可以将stderr单独重定向到一个文件,将stdout重定向到另一个文件:
$ cmd 2>stderr.txt 1>stdout.txt
还可以利用下面这个更好的方法将stderr转换成stdout,使得stderr和stdout
都被重定向到同一个文件中:
$ cmd 2>&1 output.txt
或者这样:
$ cmd &> output.txt


tee命令接收到来自stdin的数据。它将stdout的一份副本写入
文件out.txt,同时将另一份副本作为后续命令的stdin。命令cat -n将从stdin中接
收到的每一行数据前加上行号并写入stdout:
$ cat a* | tee out.txt | cat -n
cat: a1: Permission denied
1a1
2a1
查看out.txt
$ cat out.txt
a1
a1
注意,cat: a1: Permission denied 并没有在文件内容中出现。这是因为这些
信息属于stderr,而tee只能从stdin中读取。
默认情况下,tee命令会将文件覆盖,但它提供了一个-a选项,用于追加内容。例
如:$ cat a* | tee -a out.txt | cat –n


(7) 我们可以使用stdin作为命令参数。只需要将-作为命令的文件名参数即可:
$ cmd1 | cmd2 | cmd -
例如:
$ echo who is this | tee -
who is this
who is this
也可以将 /dev/stdin作为输出文件名来代替stdin。
类似地,使用 /dev/stderr代表标准错误,/dev/stdout代表标准输出。这些特殊的设备
文件分别对应stdin、stderr和stdout。
处理错误时,来自stderr的输出被丢弃到文件/dev/null中。/dev/null是一个特殊的设备文件,
它接收到的任何数据都会被丢弃。


将脚本内部的文本块进行重定向
有时候,我们需要对文本块(多行文本)进行重定向,就像对标准输入做的那样。考虑一个
特殊情况:源文本就位于shell脚本中。一个实用的例子是向log文件中写入头部数据,可以按照下
面的方法完成:
#!/bin/bash
cat<<EOF>log.txt
LOG FILE HEADER
This is a test log file
Function: System statistics
EOF
在cat <<EOF>log.txt与下一个EOF行之间的所有文本行都会被当做stdin数据。log.txt
文件的内容打印如下:
$ cat log.txt
LOG FILE HEADER
This is a test log file
Function: System statistics


array.sh
#!/bin/bash
array=(1 2 3)
echo ${array[0]}


index=2
echo ${array[$index]}


echo ${array[*]}
echo ${array[@]}


echo ${#array[*]}


举个例子,试想如何用关联数组为水果制定价格:
$ declare -A fruits_value
$ fruits_value=([apple]='100dollars' [orange]='150 dollars')
用下面的方法显示数组内容:
$ echo "Apple costs ${fruits_value[apple]}"
Apple costs 100 dollars


列出数组索引
每一个数组元素都有一个索引用于查找。普通数组和关联数组具有不同的索引类型。我们可
以用下面的方法获取数组的索引列表:
$ echo ${!array_var[*]}
也可以使用:
$ echo ${!array_var[@]
以先前提到的fruits_value数组为例,运行如下命令:
$ echo ${!fruits_value[*]}
orange apple
对于普通数组,这个方法同样可行。


alias命令的作用只是暂时的。一旦关闭当前终端,所有设置过的别名就失效了。
为了使别名设置一直保持作用,可以将它放入~/.bashrc文件中。因为每当一个新
的shell进程生成时,都会执行 ~/.bashrc中的命令。
$ echo 'alias cmd="command seq"' >> ~/.bashrc
(3) 如果需要删除别名,只用将其对应的语句(如果有的话)从 ~/.bashrc中删除,
或者使用unalias命令。或者使用alias example=,这会取消名为example
的别名。
(4) 我们可以创建一个别名rm,它能够删除原始文件,同时在backup目录中保留副本:
alias rm='cp $@ ~/backup && rm $@'


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值