shell快捷键
^R:调出历史命令
^D:退出
^A:光标移动到命令最前面
^E:光标移动到命令最后面
^k:删除光标后的字符
^U:删除光标前的字符
^S:锁屏
^Q:解锁屏幕
^Y:撤销
shell版本
存放在/etc/shells文件中,查看Linux默认shellecho $shell
变量
作用范围:仅仅在当前shell起作用
语法: 变量名=变量值
varname=varValue;
变量的赋值
-
直接赋值
a=3
-
从键盘中读入赋值
read -p "input ip:" ip
read命令被用来从标准输入读取单行数据
-
使用命令行参数赋值
cat test.sh echo $1 $2 chmod a+x test.sh ./test.sh test1 test2 test1 test2
-
利用命令的输出结果赋值
cmd='date +%F'
echo $cmd
-
从文件中读入数据赋值
vim line.sh #!/bin/bash ls *.sh >execfile while read line do echo $line done<execfile
shell变量的运算
在Linux的shell中,变量值的类型默认是字符串,不能进行直接运算,如果需要对shell变量进行运算,需要使用特殊方法.shell中用于整数运算的方法有expr、(())和¥[].shell也可以对小数进行运算
expr数值运算命令
num1=10
num2=20
expr $name1 + $name2 #30
expr 2 \* 2 #4
在使用expr命令时,运算符及用于计算的数字两边必须有空格,否则会执行失败.另外,expr也支持乘法运算,在使用乘法运算时,必须用反斜杠转义,因为shell可以将其误解为*号
(())或[]数值运算命令
num1=10
num2=20
sum=$(($num1+$num2))
echo $sum #30
echo sum=$[$sum1+$sum2] #30
let数值运算命令
let数值符合可以直接进行运算,且不带回显功能,也就是说当使用let的时候,不再使用$引用变量.let运算命令的语法格式为:let赋值表达式,其功能等同于"((赋值表达式))"
sum=2
sum=sum+8
echo $sum #sum+8
unset sum #取消变量
sum=2
let sum=sum+8
echo $sum #10
shell小数运算
bc是unix/linux下的计算器.它还可以作为命令进行小数运算,用于交互和非交互,但一般用的较少
echo "2 \* 2" | bc
shell变量的删除、替换和替代
获取变量长度:${#var}
索引:${url:4:5}
shell变量的删除
格式 | 说明 |
---|---|
${变量名#关键字符} | 如果变量内容从头开始的数据符合"关键字符",则将符合的最短数据删除 |
${变量名##关键字符} | 如果变量内容从头开始的数据符合"关键字符",则将符合的最长数据删除 |
${变量名%关键字符} | 如果变量内容从尾开始的数据符合"关键字符",则将符合的最短数据删除 |
${变量名%%关键字符} | 如果变量内容从尾开始的数据符合"关键字符",则将符合的最长数据删除 |
#实例
file=/dir1/dir2/dir3/my.file.txt #定义file变量
echo $file #显示file变量
echo ${file#*/} #最短匹配,删除/和/左边的字符串
#结果 dir1/dir2/dir3/my.file.txt
echo ${file##*/} #最长匹配,删除/和/左边的字符串
#结果 my.file.txt
echo ${file%/*} #最短匹配,删除/和/右边的字符串
#结果 /dir1/dir2/dir3
echo ${file%%/*} #最长匹配,删除/和/右边的字符串
#结果为空
shell变量的替换
格式 | 说明 |
---|---|
${变量名/旧字符串/新字符串} | 若变量内容符合旧字符串,则第一个’旧字符串’会被’新字符串’替换 |
${变量名//旧字符串/新字符串} | 若变量内容符合旧字符串,则全部’旧字符串’会被’新字符串’替换 |
#实例
var=www.baidu.com
echo ${var/baidu/qfedu} #将baidu替换为qfedu
#结果 www.qfedu.com
var=www.sina.com.cn
echo ${var//n/N} #将n替换为N
#结果 www.siNa.com.cN
shell变量的替代
给shell变量设置默认值的格式为${name-new value}
,如果变量名没有被赋值,则会使用"新的变量值",如果变量已被赋值(包括空值),则该值不会被替代.
#示例
unset port #取消变量port
echo ${port-3306} #此时port没有被赋值,则使用3306
#结果 3306
port=3307
echo ${port-3306}
结果 3307 #此时变量已被赋值,则不会使用3306
${name:-new value}
变量没有赋值(包括空值)都会使用新值,变量有被赋值:不会被替代
shell变量的自增
shell变量的自增运算符是i++,++i.i++表示先赋值再运算,++i表示先运算再复制
#i++和++i对变量的影响
i=1
let i++
echo $i
#结果 2
j=1
let ++j
echo $j
#结果 2
#可以看出,不管先赋值再自加还是先自加再赋值,其结果都是一样的
##i++和++i对表达式的影响
unset i
unset j
i=1
j=1
let x=i++
let y=++i
echo $i
#结果 2
echo $j
#结果 2
echo $x
#结果 1
echo $y
#结果 2
#可以看出,不管先赋值再自加还是先自加再赋值,表达式结果是不一样的
shell变量中的特殊符号
#表示注释 行首为#(#!是个例外)表示此行是注释
# Network information
#注释也可以放在本行命令的后面,需要注意的是#两边有空格
echo " A comment will follow." #
#注释也可以放在本行行首空白的后面
# A tab precedes this comment.
;
在同一行中分隔两个或以上的命令
echo hello;echo there
;
也适用于循环语句
#实例
#!/bin/bash
if [ -x "$filename" ]; then
echo "File $filename exists.";cp $filename $filename.back
else
echo "File $filename not found.";touch $filename
fi
;;
用于终止case选项
#!/bin/bash
case "$variable" in
abc)
echo "/variable = abc"
;;
xyz)
echo "/variable = xyz"
;;
esac
.
等价于source
命令.
:
空命令和true
命令作用相同
:
echo $? #上条命令执行成功,返回值为0
#结果 0
#在while死循环和if/then中也可以使用这个命令
while:
do
operation1
operation2
done
while:
do
operation1
operation2
done
if 条件
then : #什么也不做,引出分支
else
action
fi
#反引号命令被调用时,可以使用冒号
: $[username `whoami`]
# $[username= `whoami`]
$
表示变量替换或引用变量的内容
var1=68
var2=test
echo $var1 $var2
#结果 68 test
预定义变量
$?:判断上一个命令的执行结果,结果为true,返回0,结果为false,返回1
$$:当前进程的PID
$!:上一个后台进程的PID
$#:参数的个数
$@:所有的参数
$*:所有的参数
$0:脚本名
位置变量
#例
[root@bogon shell]# cat ping01.sh
#!/usr/bin/bash
ping -c1 $1 &> /dev/null
if [ $? -eq 0 ]; then
echo "$1 is up"
else
echo "$1 is down"
fi
[root@bogon shell]#./ping01.sh www.baidu.com
#输出结果www.baidu.com is up
自定义变量
ip=www.baidu.com
强引用与弱引用
" " : 弱引用
name="test"
out="$name"
#结果
test
’ ’ : 强引用
name="test"
out='$name'
#结果
$name
``命令替换 等价于$()
touch `date +%F`_file1.txt && \
touch $(date +%F)_file2.txt
#结果
2023-02-08_file1.txt 2023-02-08_file2.txt
&&与||
&&
当前面的命令执行成功后,执行后面的命令
|| 前面的命令执行失败后,执行后面的命令
#例
cat /etc/passwd && echo $? || echo "Fiedler"
当cat /etc/passwd执行成功,返回值为0执行echo $?,执行失败执行echo "Fiedler"
read用法
read : 从键盘读入内容
-p:打印字符串(提示信息)
-t:等待的时间
-n:字符数量
if语句
以if开始,fi结束
参数:
-f:判断是否是文件
for循环
for i in {1..5}
do
done
while循环
i=1
while [ $i -le 5 ]
do
echo "..."
let i++
done