1.在终端中显示输出
$ 表示普通用户
# 表示管理员用户root
shell脚本通常以#!/bin/bash
起始;bash将以#
符号开头的行视为注释
脚本执行的两种方式
(1)将脚本名字作为命令行参数
bash filename.sh
(2)授权脚本执行权限,将其变为可执行文件
使用chmod命令赋予脚本可执行权限
chmod a+x filename.sh
./filename.sh
echo
echo
是用于终端打印的最基本命令。默认情况下,echo
在每次调用后会添加一个换行符:
echo "Hello World"
echo Hello World
echo 'Hello World'
双引号允许shell解释字符串中出现的特殊字符。单引号不会对其做任何解释。
如果需要打印像!这样的特殊字符,那就不要放入双引号中,而是使用单引号,或是在特殊字符之前加上一个反斜线(这里是转义符的意思)
echo 'Hello World $pwd'
echo "Hello World $pwd"
在echo中转义换行符
默认情况下,echo会在输出文本的尾部追加一个换行符。可以使用选项-n
来禁止这种行为。echo同样接受双包含转义序列的双引号字符串作为参数。在使用转义序列时,需要使用echo -e
"包含转义序列的字符串"
echo -e "1 2 3"
2.使用变量和环境变量
可以使用env
或printenv
命令查看当前shell中所定义的全部环境变量
PID是相关进程的进程ID,使用pgrep命令就能获取进程ID
pgrep gedit #假设gedit是一个应用程序正在运行
变量赋值
varname=vaule
varname是变量名,value是赋给变量的值。如果value不包含任何空格,那么就不需要将其放入引号中,否则必须使用单引号或双引号
注意:varname = value
不同于varname=value
。等号两边没有空格的是赋值操作符,加上空格的等号表示的是等量关系测试。
var="value"
echo $var #变量前加上$就可以访问变量的内容
export
export 可新增,修改或删除环境变量,供后续执行的程序使用
PATH
变量列出了一些列可供shell搜索特定应用程序目录
如果需要在PATH中添加一条新路径,可以使用如下命令:
export PATH="$PATH:/home/user/bin"
补充知识点
获取字符串长度
在变量强添加${#variable}
var=1234567
echo ${#var}
修改bash的提示字符串
查看设置变量PS1的那一行
cat ~/.bashrc | grep PS1
PS1="XXX"
3.使用shell进行数学运算
bash shell使用let、(())、和[]执行基本的算术操作。攻击expr和bc可以用来执行高级操作
let
let命令可以直接执行基本的算术操作。当使用let时,变量名之前不需要在添加$。
#!/bin/bash
n1=4
n2=5
let result=n1+n2
echo $result
自加操作
let n1++
自减操作
let n1--
[]和()
操作符[]的使用方法和let命令一样:
result=$[ n1 + n2 ]
在[]中也可以使用$前缀
result=$[ $n1 + 5 ]
也可以使用(())。出现在(())中的变量名之前需要加上$:
result=$(( n1 + 50 ))
expr
expr同样也可以用于基本算术操作
result=`expr 3 + 4`
result=$(expr $n1 + 5)
注意:以上方法不支持浮点数,只能用于整数运算
bc
bc支持浮点数计算
echo "4 * 0.56" | bc
设置小数精度:scale
echo "scale=2;22/7" | bc #scale=2将小数位个数设为2
进制转换: obase
#!/bin/bash
no=100
echo "obase=2;$no" | bc
echo "obase=10;$no" | bc
计算平方以及平方根
echo "sqrt(100)" | bc
echo "10^10" | bc
4.文件描述符与重定向
(1)使用大于号将文本保存到文件中
echo "This is a sample text 1" > temp.txt
(2)使用双大于号将文本追加到文件中
echo "This is sample text 2" >> temp.txt
注意:>会清空该文件中先前的内容
5.数组与关联数组
(1)可以在单行中使用数组值列表来定义一个数组
array_var=(test1 test2 test3 test4)
还可以通过索引值来定义数组
array_var[0]="teset1"
array_var[1]="teset2"
array_var[2]="teset3"
array_var[3]="teset4"
(2)打印特定索引的数组元素内容
echo ${array_var[0]}
(3)以列表形式打印数组中的所有值
echo ${array_var[*]}
6.别名
alias命令创建别名
(1).创建别名
alias new_command='command sequence'
注意alisa命令的效果只是暂时的。一旦关闭当前终端,所有设置过的别名就失效了。
如果需要删除别名,可以使用alias example=,
7.获取并设置日期及延时
(1).读取日期
date
(2).打印纪元
date +%s
可以使用纪元的插值来计算一组命令所花的时间
延时
sleep命令可以延迟脚本执行一段时间(以秒为单位)
sleep 1 # 延时1秒
8.调试脚本
(1).使用选项-x,启用shell脚本的跟踪调试功能。运行带有-x选项的脚本可以打印出所执行的每一行命令以及当前状态。
bash -x xxx.sh
9.函数和参数
函数和参数
(1).函数的定义
function fname()
{
statmemts;
}
或者
fname()
{
statmemts;
}
(2).只需要使用函数名就可以调用函数,函数参数可以按位置访问,$1是第一个参数,$2是第二个参数...
fname()
{
echo $1, $2;
echo "$@";
echo "$*";
return 0;
}
知识点补充:
$0 是脚本名称
$1 是第一个参数
$2 是第二个参数
$n 是第n个参数
$@ 所有参数
$* 所有参数
$? 读取上个命令是否执行成功,如果成功返回0。
注意常用$@
导出函数
函数也能像环境变量一样用export
导出,如此一来,函数的作用域也可以扩展到子进程中
export -f fname
10.read
read
提供了一种在不需要按下回车键就能读入字符的功能
(1).从输入中读取n个字符并保存
read -n 2 var # 输入2个字符不需要按回车就能保存到var中
(2).使用无回显的方式读取密码
read -s var # 注意需要回车
(3).使用read显示提示信息
read -p "Enter Input:" var
(4).用特定的定界符作为输入行的结束
read -d "!" var
hello! # var被设置为hello
11.比较与测试
(1).if
if condition;then
commands
fi
(2).else if
if [ condition ];then
commands;
else if [ condtion ];then
commands;
fi
(3).知识点补充
-eq 等于
-nq 不等于
-gt 大于
-lt 小于
-ge 大于或等于
-le 小于或等于
-a and
-o or
-f 是否为文件
-x 是否为可执行文件
-d 是否为目录
-e 文件是否存在
-c 是否为字符设备文件
-b 是否为块设备文件
-w 文件是否可写
-r 文件是否可读
-z 为空
-n 不为空
(4).字符串比较
字符串比较时,最好使用双括号。
测试两个字符串是否相同
[[ $str1 == $str2 ]]
[[ $str1 != $str2 ]]
(5).测试空串
[[ -z $str ]] # 如果str为空则返回真
[[ -n $str ]] # 如果str不为空则返回真