【shell命令】基础知识
Shell
Shell :可以理解为后台运行的程序(命令解释器),作用是用来解析你输入的命令,搜索环境变量,找到命令文件,运行命令文件。
Shell 是一个命令解释器,它在操作系统最外层,负责与用户对话。shell保存在/etc/shells目录中
Shell 既是一种脚本编程语言,也是一个连接内核和用户的软件。
几种常见的Shell:
Linux 是“万国牌”,由多个组织机构开发,不同的组织机构为了发展自己的 Linux 分支可能会开发出功能类似的软件,它们各有优缺点,用户可以自由选择。Shell 就是这样的一款软件,不同的组织机构开发了不同的 Shell,它们各有所长,有的占用资源少,有的支持高级编程功能,有的兼容性好,有的重视用户体验。
常见的Shell有:sh、bash、csh、tcsh、ash
sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 Shell。
bash shell 是 Linux 的默认 shell。
bash 兼容 sh 意味着,针对 sh 编写的 Shell 代码可以不加修改地在 bash 中运行。
符号
${vars},$vars:取出变量结果
$():执行命令,并拿到命令执行结果
(命令):开启子shell执行命令
#!
用来说明文件类型,例:#!/bin/base 表明该文件是bash程序
执行多个命令
ls;pwd;echo 123;
执行外部脚本文件的两种方式
#在子shell中执行2.sh脚本,不能共享变量
./2.sh #或 base ./2.sh
#在当前shell中执行2.sh脚本,可以共享变量
. ./2.sh #或 source ./2.sh
让程序在后台运行
# 1> /dev/null将错误日志写入黑洞文件
nohup xxx & 1> /dev/null
exit退出程序
[ $#-ne 2] && {
echo "must be two args"
exit 119 #终止程序运行,且返回119状态码,提供给当前shell的$?变量,若是在函数里可以return 119用法
}
echo ok
命令文件添加执行权限
有了执行权限才可以执行chmod +x 文件名
eval命令
eval是一个内置命令,它能够解析并执行包含多条命令的字符串
cmd="ls -l;pwd"
eval $cmd
执行历史命令
#查看历史命令
history
#执行一条历史命令
!命令编号
#执行上条命令
!!
管道符
|:命令1的输出做为命令2的数据
ls -l | grep "sh"
echo "a.sh" | grep "sh" # a.sh
重定向
>、1>:输出重定向
案例:echo 'haha' >test.txt 向test.txt输出内容,如果内容存在就清空
>>、1>>:追加输出重定向
案例:echo 'haha' >test.txt 向test.txt追加输出内容
<、0<:输入重定向
案例:xargs -n 2 <test.txt
<< 、0<<:追加输入重定向
2>:输出错误重定向
案例:
echo haha 2>a.txt 如果命令错误,则把错误信息输出到a.txt
echo haha >a.txt 2>b.txt 如果命令错误,则把信息输出到a.txt,把错误信息输出到b.txt
echo haha >a.txt 2>&1 如果命令错误,则把信息输出到a.txt,把错误信息也输出到a.txt
echo haha &>a.txt 如果命令错误,则把信息输出到a.txt,把错误信息也输出到a.txt
ls &>/dev/null 不在屏幕输出内容
2>>:追加输出错误重定向
&>:输出重定向和错误输出重定向
命令顺序执行
;命令1;命令2 --多个命令顺序执行,命令之间没有逻辑联系&&命令1&&命令2 --逻辑与,当命令1正确执行,则命令2才会执行||命令1||命令2 --当命令1执行不正确,命令2才会执行;当命令1正确执行,命令2不会执行
通配符
?--匹配一个字符*--匹配0或多个字符[]--匹配中括号中的任意一个字符,例:[abc]、[a-z][^]--逻辑非,表示匹配不是中括号中的一个字符
特殊符号
'' --单引号,单引号中所有特殊字符都没有特殊含义
"" --双引号,双引号中可以包含特殊符号
$() --反引号,反引号括起来的内容是系统命令,在bash中先执行它,和反引号作用一样
# --井号,注释
$ --用于调用变量的值
\ --反斜杠,转义符
set命令
set:输出所有变量,包括全局变量
set -x:启用调试模式,执行命令前先打印命令内容(等价于set -o xtrace)
set +x:关闭调试模式
set -e:脚本中任何命令返回非零状态时立即退出(等价于set -o errexit)
set -u:使用未定义变量时报错并退出(等价于set -o nounset)
set -o pipefail:管道中任意命令失败即视为整个管道失败
典型组合:在脚本开头使用set -euo pipefail可增强健壮性,避免静默错误
案例
#批量创建文件
touch t_{1..5}.txt
#批量删除文件
rm -f t_*.txt
#批量修改文件名(将.txt改成.jpg)
for item in `ls *.txt`
do
mv $item "${item/\.txt/.jpg}"
done
数值计算的几种写法
(())双小括号:
| 运算操作符与运算命令 | 意义 |
|---|---|
((i=i+1)) |
此种书写方法为运算后赋值法,即将i+1的运算结果赋值给变量i。注意,不能用echo ((i=i+1))的形式输出表达式的值,但可以用echo $((i=i+1))输出其值 |
i=$((i+1)) |
可以在(())前加$符,表示将表达式运算后赋值给i |
((8>7&&5==5)) |
可以进行比较操作,还可以加入逻辑与和逻辑或,用于条件判断 |
echo$((2+1)) |
需要直接输出运算表达式的运算结果时,可以在(())前加$符 |
$[ ] 旧式算术扩展
功能与$(( ))类似,但已逐渐被淘汰,不推荐使用
echo $[a * b]
expr命令
外部命令,需空格分隔操作符,*需转义,仅支持整数
expr 5 \* 3 # 输出15
sum=$(expr $a + $b) # 赋值需命令替换
缺点:
语法繁琐(如转义、空格要求)。
性能低于内置运算方式。
let命令
let命令是Shell脚本编程中用于执行算术运算的内置命令,它提供了一种简洁高效的方式来处理数学表达式和变量赋值。let和(())功能相似,都是内置命令
语法简洁:可以直接使用变量名而不需要添加$前缀(在大多数情况下)
支持复杂表达式:能够处理多种算术运算和复合赋值
基本语法:
#以下三种是等价的
let 表达式
let "表达式"
let '表达式'
案例:
let a=5+3 # 将a赋值为8
let b=a*2 # 将b赋值为a的两倍(16)
let c=b%5 # 将c赋值为b除以5的余数(1)
let a+=5
let i++
let a=1+6 b=a-1 c=a+b # 多表达式计算
declare -i
将变量定义为整数类型后可直接运算
declare -i x=5 y=3
x+=y
bc命令
支持浮点运算和高精度计算,需通过管道输入表达式
echo "5+3" | bc # 加法 → 8
echo "10-4" | bc # 减法 → 6
echo "3 * 4" | bc # 乘法 → 12
echo "10/3" | bc # 整数除法 → 3
echo "10%3" | bc # 取模 → 1

浙公网安备 33010602011771号