shell脚本知识

变量赋值:

var=value       #var是变量名,value是赋给变量的值,如果value不包含任何空白字符(例如空格),那么它不需要使用引号进行引用,反之,则必须使用单引号或双引号

var="value name"    #给变量赋值

变量输出:

echo $var     或者   echo  ${var}

环境变量:

常用的环境变量: HOME, PWD, USER, UID, SHELL等

$echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin     

#将shell脚本放入这些目录下,可以直接运行shell脚本,而不需要写绝对路径.

获取字符串的长度:

length=${#var}       #在输出的变量前加一个#就可得到字符串的长度

#!/bin/bash
var=1234556645567676765
echo ${#var}

结果:19

识别当前的shell版本:

$echo $SHELL
/bin/bash

$echo $0
-bash

检查用户是否为超级用户:

#!/bin/bash
if [ $UID -ne 0 ];then
   echo non root user, please run as root
else
   echo "root user"
fi

数学运算: 

在Bash shell环境中,可以利用let, (())和[ ]执行基本的算数操作,在进行高级操作时,expr和pc这两个工具也会非常有用,

以下的方法只能用于整数运算,不支持浮点数:

#!/bin/bash
#用普通的变量赋值方法定义数值,这时,它会被存储为字符串,然而可以用一些方法使它能像数字一样进行处理
nu1=4;
nu2=5;
let result=nu1+nu2   #当使用let时,变量名前不需要再添加$
echo $result
let result++   #自加操作,每次自加1
echo $result
let result--    #自减操作,每次自减1
echo $result
let no+=6     #等于no=no+6
let no-=6     #等于no=no-6

 

#!/bin/bash
no1=5;
no2=6;
result=$[ no1 + no2 ] 
echo $result
result=$[ $no1 + 5 ]  #在[]中也可以加$,不加也行
echo $result
result=$(( no1 + 50 ))  #使用(())计算时,变量名之前要加$
echo $result
result=`expr 3 + 4`   #expr 用于基本运算
echo $result
result=$(expr $no1 + 5)    #``反撇号和$()作用相同,都是将命令运行的结果作为参数使用

bc是一个用于数学运算的高级工具,可以用它执行浮点数运算并应用一些高级函数:

#!/bin/bash
no=54;
echo "5 * 0.56" | bc
result=`echo "$no * 1.5" | bc`
echo $result

设定小数精度(数值范围):

echo "scale=2; 3/8" | bc  #scale=2将小数位个数设置为2
0.37

进制转换(用bc可以将一种进制系统转换成另一种):

#!/bin/bash
no=100
echo "obase=2;$no" | bc   #将变量no转换成二进制,obase=2
no=10100100
echo "obase=10;ibase=2;$no" | bc   #将现有的二进制ibase=2,转换成十进制obase=10

echo "sqrt(100)" | bc   #计算平方根,10
echo "10^10" | bc       #10的10次方
1100100
164
10
10000000000

我们在编写脚本的时候会频繁使用标准输入(stdin), 标准输出(stdout)和标准错误(stderr),通过内容过滤将输出重定向到文件是我们从事的基础任务之一.

文件描述符是与一个打开的文件或数据流相关联的整数, 文件描述符0, 1以及2是系统预留的:

0-----stdin(标准输入)

1-----stdout(标准输出)

2-----stderr(标准错误)

$cat /etc/passwd >  /opt/test.txt  #'>'重定向输出,没有文件则会自动创建,
#如果文件中有内容,则会覆盖原有的内容; '<' 是重定向输入

$cat /etc/passwd >>  /opt/test.txt  #重定向追加,将内容追加在文本内容的尾部
#当使用重定向操作符时,重定向的内容不会出现在终端,而是直接导入文件,
#重定向操作符默认使用标准输出,如果想使用特定的文件描述符,你必须将描述符置于操作符之前.
#命令发生错误退出时,它会返回一个非0的退出状态数值;而当命令成功完成后,返回数字0

$ls + 2> /opt/out.txt  #将错误信息存放在out.txt,正常运行
$cmd 2> stderr.txt 1>stdout.txt    #将错误信息存放在stderr.txt,正确信息存放在stdout.txt

$cat /etc/passwd 2>&1 output.txt  或 $cmd &> output.txt   #将stderr转换成stdout,
#使stderr和stdout都被重定向到同一个文件中

$cat /etc/passwd &> /dev/null   #将输出信息(正确或错误的)扔到黑洞中,/dev/null是一个特殊
#的设备文件,这个文件接收到的任何数据都会被丢弃
$cat test.sh | tee my.txt  #输出test.sh的内容,tee将内容重定向到my.txt中

$cat test.sh | tee my.txt | cat -n  #tee命令接收来自stdin的数据,
#它将一份副本写入my.txt,默认覆盖原有内容,另一份副本作为后续命令的stdin,
#cat -n 将从stdin中接收到的每一行数据前加上行号并写入stdout

$cat test.sh | tee -a my.txt | cat -n  #tee命令会将文件覆盖,-a选项,用于追加内容
#tee只能从stdin中读取数据

重定向脚本内部的文本块:(将多行文本像标准输入一样进行重定向)

格式:
cat <<EOF>文件路径
.....
文本
.....
EOF

示例:
#!/bin/bash
cat <<EOF>/opt/test2.txt
这是一个测试
文本块
你是成功的吗
EOF

#脚本执行以后,如果/opt/test2.txt有内容则会被覆盖

数组和关联数组:

bash同时支持普通数组和关联数组,普通数组只能使用整数作为数组索引,而关联数组可以用字符串作为数组引用.

定义数组:

array_var=(1 2 3 4 5 6)    #这些值将会存储在以0为起始索引的连续位置上

将数组定义成一组索引-值:
array_var[0]="test1"

array_var[1]="test2"
array_var[2]="test3"

array_var[3]="test4"
index=5
echo ${array_var[index]}  #打印出特定索引的数组元素内容
echo ${array_var[*]} 或 echo ${array_var[@]}   #打印数组中的所有值

关联数组:(可以使用任意文本作为数组的索引, 普通数组只能用整数作为数组索引)

#!/bin/bash
declare -A ass_array   #定义关联数组
数组赋值方法一:
ass_array=([apple]='100' [orange]='200')
echo ${ass_array[apple]}  #打印值
echo ${!ass_array[*]}   #打印所有的索引

数组赋值方法二:
ass_array[apple]='100'
ass_array[orange]='200'

使用别名:(一种便捷方式,省去用户输入一长串命令序列的麻烦)

alias install='sudo apt-get install'       
#临时别名,重启失效,可以写入/etc/.bashrc 全局生效, /root/.bashrc 只针对当前用户

获取终端信息:

编写shell脚本, 总是免不了大量处理当前终端的相关信息,比如行数, 列数, 光标位置和遮盖密码字段等.

tput和stty是两款终端处理工具:

$tput cols  #获取终端的列数
$tput lines  #获取终端的行数
$tput longname  #打印当前终端名
$stty echo  #打开屏显,在终端输入密码显示
$stty -echo #关闭屏显,在终端输入密码不显示

获取, 设置日期和延迟:

很多应用程序需要以不同的格式打印日期,设置日期和时间,以及根据日期和时间执行操作. 延时通常用于计划任务中,比如每隔多长时间执行一次任务, 需要掌握如何在程序中加入延时.

#--date 用于提供日期串作为输入
$date --date "Jan 20 2001" +%A    #Saturday
$date --date "Thu Nov 18 08:07:21 IST 2010" +%s  #1290047841秒

$date "+%d %B %Y"     #23 七月 2019
检查一组命令所花费的时间
#!/bin/bash
start=$(date +%s)
commands;
statements;

end=$(date +%s)
difference=$((end - start))    #计算方法$(())
echo Time taken to execute commands is $difference seconds.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值