变量赋值:
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.