【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
posted @ 2021-01-31 18:14  .Neterr  阅读(155)  评论(0)    收藏  举报