命令历史记忆功能
!number、!string、ctrl+r、!!
别名
alias、unalias
快捷键
<kbd>Ctrl</kbd>+<kbd>d</kbd>删除光标位置字符
ctrl+a 移动到命令行首
ctrl+e 移动到命令行尾
ctrl+l 清屏
ctrl+u 删除光标到行首,并复制到粘贴板、
ctrl+k 删除光标到行尾,并复制到粘贴板
ctrl+y 粘贴粘贴板内容
shell前后台作业控制
& 后台执行
nohup 不挂起任务
ctrl+c 终止当前操作
ctrl+z 当前任务到后台
bg % 1 将任务到后台
fg % 1 将任务到前台
kill % 3 关闭任务
screen、
jobs 查看任务
tee 将数据重定向到文件
admin@DESKTOP-H0TURO1 ~/script
$ ls | tee a | cat
spliter
admin@DESKTOP-H0TURO1 ~/script
$ cat a
spliter
shell通配符
- 匹配任意多个字符
? 匹配任意单个字符
[] 匹配括号中一个字符,[^a-z]取反
() 子shell中执行括号内命令
{} 集合
\ 转义
- 子shell中执行
~/script.sh
bash script.sh
- 当前shell中执行
source script.sh
. script.sh
# a.sh
##!/bin/bash
##echo $ID
[admin@DESKTOP-H0TURO1]$ . a.sh
20699
[admin@DESKTOP-H0TURO1]$ ./a.sh
[admin@DESKTOP-H0TURO1]$ source a.sh
20699
[admin@DESKTOP-H0TURO1]$ bash a.sh
[admin@DESKTOP-H0TURO1]$
shell变量
- 自定义变量:变量名=变量值
变量引用:$变量名、${变量名}
read:读取键盘输入 - 位置变量
$1
第一个入参 - 环境变量
export
修饰 - 预定义变量
-
$?
:上个命令的返回值 0表示成功 -
$!
:上一个后台进程PID -
$$
:当前进程PID -
$0
:脚本名 -
$*
、$@
:所有的参数 -
$#
:参数个数
-
- 只读变量
readonly id=2
- 删除变量
unset id
- 命令替换
$()
、``
命令替换,先执行命令再赋值
num=$(date +%F)
num=`date +%F`
单引号中变量不起作用
双引号中变量起作用
#!/bin/bash
id=12
echo $id,${id}
read -p "please input a number:" num
echo "input number is: $num"
echo "first variable is \$1: $1"
echo "script name is \$0: `basename $0` and `dirname $0`"
echo "last command return \$?: $?"
echo "parameter num is \$#: $#"
echo "all parameter is \$@: $@"
$ ./variable_01.sh lucy lilly
12,12
please input a number:2
input number is: 2
first variable is $1: lucy
script name is $0: variable_01.sh and .
last command return $?: 0
parameter num is $#: 2
all parameter is $@: lucy lilly
变量运算
expr 1+3
$(())
$[]
let num=1+1
- 算术运算符
+
、-
、\*
、/
、%
、==
、!=
- 关系运算符
-ge
、-gt
、-eq
、-ne
、-le
、-lt
- 布尔运算符
!
、-a
、-o
- 字符串运算符
=
、!=
- 文件测试运算符
-f
、-d
#!/bin/bash
a=10
b=5
var=`expr $a + $b`
echo "a+b=$var"
var=$((a - b))
echo "a-b=$var"
var=$[a * b]
echo "a*b=$var"
var=$[a / b]
echo "a/b=$var"
echo "a=$a,b=$b"
[ $a -le $b ] && echo "yes" || echo "no"
test $a -ge $b && echo "yes" || echo "no"
[ -f $0 ] && echo "yes" || echo "no"
变量内容删除和替换
${url#s}
从前往后,最短匹配
${url##s}
从前往后,最长匹配
${url%s}
从后往前
if
if [ expression ] then echo "a" elif [ expression2 ] then echo "b" else echo "c" fi
test
[ ]
[[ ]]
支持正则 =~
#!/bin/bash
read -p "please input first num " a
read -p "please input second num " b
if [ $a -gt $b ]
then
echo "$a greater then $b"
elif [ $a -lt $b ]
then
echo "$a less then $b"
else [ $a -eq $b ]
echo "$a equals $b"
fi
seq
序列命令
case
#!/bin/bash
read -p "please input a number between 1 to 4 " num
case $num in
1)
echo "you select 1"
;;
2)
echo "you select 2"
;;
3)
echo "you select 3"
;;
4)
echo "you select 4"
;;
*)
echo "err"
;;
esac
trap
捕捉信号,执行命令
while
#!/bin/bash
a=1
while [ $a -lt 10 ]
do
echo $a
let a++
done
for
for ((i=0;i<10;i++))
do
echo "loop $i"
done
for v in `seq 10`
do
echo "loop2 $v"
done
for a in "a" "b" "c"
do
echo $a
done
profile、bashrc
- 系统级
1 /etc/profile
2 /etc/bashrc - 用户级
3 ~/.bash_profile
4 ~/.bash_rc
5 ~/.bash_logout
6 ~/.bash_history
登出时执行5、6
login shell
登录时执行1、2、3、4
su - alice
nologin shell
登录时执行2、4
su alice
函数
函数名(){}
function 函数名{}
函数的返回值是最后一条命令的状态码
shell默认返回值最大255
输入输出重定向
>
输出重定向
>>
拼接输出
<
输入重定向
<<tag
开始标记tag和结束标记tag之间的内容作为输入
> /dev/null
输出屏蔽