$ cat ~/.bashrc | grep HIS HISTCONTROL=ignoreboth # for setting history length see HISTSIZE and HISTFILESIZE in bash(1) HISTSIZE=1000 HISTFILESIZE=2000
!n:重复执行第 n 条历史命令,先用 history 查看条数
!!:重复执行上条历史命令
!xxx:重复执行最后一条以 xxx 开头的命令
1 2
$ !echo echo "alias ls='ls -lh'" >> ~/.bashrc
Bash 中,命令与目录均可以用 Tab 键即可补全。
脚本执行
赋予执行权限,通过绝对路径或相对路径执行
chmod 755 xx.sh
./xx.sh
通过 bash 直接执行脚本,不需要执行权限
bash xx.sh
命令行展开
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
$ echo {1,2,3,4} 1 2 3 4 $ echo file{1,3,6} file1 file3 file6 $ echo {1..5} 1 2 3 4 5 $ echo {1..5..2} 1 3 5 $ echo {01..05..2} 01 03 05 $ echo {a..e} a b c d e
别名与快捷键
别名
alias 别名='原命令'
unalias 别名:取消别名
\ 命令:忽略别名执行命令
1 2 3
$ alias alias grep='grep --color=auto' alias ls='ls --color=auto'
命令行中定义的别名重启即失效,需要写入环境变量配置文件才能永久生效,如 ~/.bashrc
1 2 3 4
$ echo"alias ls='ls -lh'" >> ~/.bashrc $ . ~/.bashrc $ alias alias ls='ls -lh'
命令执行顺序
通过相对路径或绝对路径调用
别名
Bash 内部命令,如 cd
1 2 3 4
$ whereis ls ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz $ whereis cd cd:
PATH 环境变量定义的目录中查找到的第一个命令
Bash 常用快捷键
常用的
Ctrl+A:光标移到开头
Ctrl+E:光标移到结尾
Ctrl+C:强制终止当前命令
Ctrl+L:清屏,相当于 clear
Ctrl+U:删除或剪切光标之前输入的命令
Ctrl+K:删除或剪切光标之后输入的命令
Ctrl+Y:粘贴 Ctrl+U 或 Ctrl+K 剪切的内容
Ctrl+R:在历史命令中搜索
Ctrl+D:退出当前终端
输入输出重定向
输出重定向
Linux 中标准的输入输出和标准错误输出:
设备
文件名
文件描述符
类型
键盘
/dev/stdin
0
标准输入
显示器
/dev/stdout
1
标准输出
显示器
/dev/stderr
2
标准错误输出
正常情况下,Shell 通过显示器输出命令返回的内容,可以通过重定向将其存入文件。
将正确输出重定向至文件
ls > file,ls >> file(追加写入)
1 2 3 4 5 6 7 8 9 10
$ ls a b date_now $ ls > right $ cat right a b date_now right $ ls > /dev/null # 输出丢进黑洞
将错误输出重定向至文件
lssss 2> file_error,注意 2 和 > 之间没有空格
lssss 2>> file_error(追加写入)
1 2 3
$ lssss 2> file_error $ cat file_error lssss: command not found
将正确和错误输出同时重定向至文件
ls > file 2>&1,ls >> file 2>&1(追加写入)
或 ls &> file
1 2 3 4 5 6 7 8
$ ls > file 2>&1 $ cat file a b file $ lss > file 2>&1 $ cat file Command 'lss' not found, but there are 15 similar ones.
将正确和错误输出分开重定向至文件
ls > right 2> error,ls >> right 2>> error(追加写入)
1 2 3 4 5 6 7 8 9
$ ls > right 2> error $ cat right right testfile $ cat error $ lss > right 2> error $ cat right $ cat error Command 'lss' not found, but there are 15 similar ones.
$ date;ddif=/dev/zero of=./testfile bs=1k count=102400;date Sun Jul 3 09:01:03 AM CST 2022 102400+0 records in 102400+0 records out 104857600 bytes (105 MB, 100 MiB) copied, 0.19336 s, 542 MB/s Sun Jul 3 09:01:03 AM CST 2022
例:&&
1 2 3 4 5
$ ls && echoyes linux_learn testfile yes $ lsssss && echoyes lsssss: command not found
例:||
1 2 3 4 5
$ ls || echoyes linux_learn testfile $ lssss || echo no lssss: command not found no
命令 && echo yes || echo no,判断命令是否正确执行
1 2 3 4 5 6
$ ls && echoyes || echo no linux_learn testfile yes $ lssss && echoyes || echo no lssss: command not found no
for i in "$*" do echo $i done for j in "$@" do echo $j done $ ./arg4.sh 1 2 3 4 1 2 3 4 1 2 3 4
预定义变量
位置参数变量是预定义变量的一种。
变量
作用
&?
上一条命令的执行情况,0:正确执行,不同错误返回不同值
$$
当前进程的 PID 号
$!
后台运行的最后一个进程的 PID 号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
$ cat arg5.sh #!/bin/bash
echo $$ find hello.sh & echo $! $ ./arg5.sh 410 411 $ find: ‘hello.sh’: No such file or directory $ echo $? 130 $ ls arg1.sh arg2.sh arg3.sh arg4.sh arg5.sh linux_learn testfile $ echo $? 0
键盘输入
比用
位置参数变量接收输入信息更加直观。
read [选项] 变量
-t:时间限制,秒
-p:输入提示
-s:隐藏输入信息
-n:限制输入字符数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
$ cat arg5.sh #!/bin/bash
read -t 30 -p "Input your name: " name echo $name
read -t 30 -s -p "Input your age: " age echo -e "\n" echo $age $ ./arg5.sh Input your name: nb nb Input your age:
25
数值运算与运算符
数值运算
Bash 中默认变量为字符串型,不能进行数值运算
1 2 3 4
$ a=1 $ b=2 $ echo$a+$b 1+2
方法 1
declare:声明变量的类型
-:给变量设定类型属性
+:取消变量的类型属性
-i:将变量声明为整数型
-x:将变量声明为环境变量
-p:显示变量被声明的类型
declare -i c=$a+$b 即可。
1 2 3 4 5 6 7 8 9 10 11
$ declare -p a declare -- a="1" $ declare -i a $ declare -p a declare -i a="1" $ declare -x a $ declare -p a declare -ix a="1" $ declare -i c=$a+$b $ echo$c 3
方法 2
expr 或 let(不常用)
+ 号左右空格不能省略
1 2 3
$ d=$(expr$a + $b) $ echo$d 3
方法 3
$(()) 或 $[](常用)
总结:$,表示变量值;$(),表示系统命令;$(()),表示数值运算
1 2 3 4 5 6
$ f=$(($a+$b)) $ echo$f 3 $ g=$[$a+$b] $ echo$d 3
运算符
$(()) 包起来即可,里面正常写算式,通用优先级。
变量测试与内容替换
变量置换方式
y 不存在
y 为空
y 不为空
x=${y-new}
x=new
x 为空
x=$y
…
内容太多,容易记混,遇到查表即可
1 2 3 4 5 6 7 8 9 10 11 12
$ unset y $ x=${y-new} $ echo$x new $ y="" $ x=${y-new} $ echo$x $ y="old" $ x=${y-new} $ echo$x old
环境变量配置文件
将环境变量写入相应配置文件中,便于在所有 shell 中生效。
修改环境变量后,source 配置文件 或 . 配置文件,不用重新登录即可使配置文件生效。
默认的系统环境变量主要有:PATH、HISTSIZE、PS1、HOSTNAME等。
环境变量配置文件类型:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
~/.bash_profile
~/.bashrc
前三个对所有用户均生效,后两个只对当前用户生效。
配置文件作用
配置文件的调用顺序
1 2 3 4 5 6 7 8 9
graph LR A["/etc/profile"] -->B["~/.bash_profile"] B --> C["~/.bashrc"] C --> D["/etc/bashrc"] D --> E[命令提示符] A --> F["/etc/profile.d/*.sh"] D --> F F --> G["/etc/profile.d/lang.sh"] G --> H["/etc/sysc config/i18n"]
/etc/profile:shell 登录即读取,作用如下:
定义 USER 变量
LOGNAME
MAIL
PATH
HOSTNAME
HISTSIZE
unmask
调用 /etc/profile.d/*.sh 中的所有文件
~/.bash_profile 作用:
调用 ~/.bashrc
在 PATH 变量后加入了 $HOME/bin 目录
~/.bashrc 作用:
定义别名
调用 /etc/bashrc
/etc/bashrc:无 login 的 shell 读取(子 shell)
PS1
umask
PATH
调用 /etc/profile.d/*.sh 中的所有文件
越往后的配置文件优先级越高
其他环境配置文件
注销生效的配置文件 :~/.bash_logout,如注销后清空历史即可将命令写入该文件。
1 2 3 4 5 6 7 8
$ cat ~/.bash_logout # ~/.bash_logout: executed by bash(1) when login shell exits. # when leaving the console clear the screen to increase privacy
if [ "$SHLVL" = 1 ]; then [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q fi
$ sed '2p' student.txt ID Name Gender Mark 1 Liming M 86 1 Liming M 86 2 Sc M 90 3 Gao M 83 $ sed -n '2p' student.txt # 加 -n 才会只输出经过处理后的,一般 p 与 -n 配合 1 Liming M 86 $ sed '2,3d' student.txt ID Name Gender Mark 3 Gao M 83 $ sed 's/M/W/g' student.txt ID Name Gender Wark 1 Liming W 86 2 Sc W 90 3 Gao W 83 $ sed '3s/W/M/g' student.txt # 可只替换某一行 ID Name Gender Wark 1 Liming W 86 2 Sc M 90 3 Gao W 83 $ sed '2a hello\ > world' student.txt ID Name Gender Wark 1 Liming W 86 hello world 2 Sc W 90 3 Gao W 83 $ sed '2i hello\ world' student.txt ID Name Gender Wark hello world 1 Liming W 86 2 Sc W 90 3 Gao W 83 $ sed '2,3c hello\ world' student.txt ID Name Gender Wark hello world 3 Gao W 83 # 多命令同时执行 $ sed -e '4s/W/M/g;1d' student.txt 1 Liming W 86 2 Sc W 90 3 Gao M 83
if [ -z $file ] # 先判断是否非空 then echo "ERROR, reinput" exit 69 # 以错误1退出 elif [ ! -e $file ] # 判断文件是否存在 then echo "File not exist" exit 2 elif [ -f $file ] then echo "A normal file" elif [ -d $file ] then echo "A dir" else echo "Other file" fi $ ./file.sh Input a file or dir: /etc A dir $ ./file.sh Input a file or dir: /etc/passwd A normal file $ ./file.sh Input a file or dir: sasasa File not exist $ ./file.sh Input a file or dir: ERROR, reinput $ echo $? 69
case
语法
1 2 3 4 5 6 7 8 9 10 11
case $v in case1) do something ;; case2) do something ;; *) do something ;; esac