shell 命令

328 阅读4分钟

命令

基本命令

$ command [options] [arguments]
#!/bin/bash
echo "hello juejin !"

内建命令

所谓shell内建命令、就是由bash自身提供的命令、而不是文件系统中的某个可执行文件.

例如,用于进入或者切换目录的 cd 命令,虽然我们一直在使用它,但如果不加以注意很难意识到它与普通命令的性质是不一样的:该命令并不是某个外部文件,只要在 Shell 中你就一定可以运行这个命令。

可以使用 type 来确定一个命令是否是内建命令:

type cd
# cd is a shell builtin

type ifconfig
# ifconfig is /sbin/ifconfig

cd是内建命令、ifconfig、不是内建命令 image.png

还记得系统变量 $PATH 吗?$PATH 变量包含的目录中几乎聚集了系统中绝大多数的可执行命令,它们都是外部命令。
通常来说,内建命令会比外部命令执行得更快,执行外部命令时不但会触发磁盘 I/O,还需要 fork 出一个单独的进程来执行,执行完成后再退出。而执行内建命令相当于调用当前 Shell 进程的一个函数。

alias

使用 alias 命令自定义别名的语法格式:

alias label='value'

比如,一般的关机命令 shutdown -h now 写起来比较长,这时可以重新定义一个关机命令:

alias sd='shutdown -h now'

再如,通过 date 命令可以获得当前的 UNIX 时间戳,具体写法为 date +%s:

alias timestamp='date +%s'

在代码中使用 alias 命令定义的别名只能在当前 Shell 进程中使用,在子进程和其它进程中都不能使用。当前 Shell 进程结束后,别名也随之消失。

# 如何使用
alias mulu="pwd"
# 执行mulu
mulu
# 输出和直接使用pwd一样的效果

echo

用于在终端输出字符串,并在最后默认加上换行符。

#!/bin/bash

name="tsejx"
url="https://github.com"

# 直接输出字符串
echo "Hello world!"
# 输出变量
echo $url
# 双引号包围的字符串中可以解析变量
echo "${name}的网址是:${url}"
# 单引号包围的字符串不能解析变量
echo '${name}的网址是:${url}'

image-1.png

read

用于标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘读取用户输入的数据;如果进行了重定向,那么可以从中读取数据。
read [-options] [variables]
  • options 表示选项

  • variables表示用来存储数据的变量、可以只有一个、也可以有多个

    两个参数都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 REPLY 中。 eg

#!/bin/bash
read -p "Enter some information > " name url age
echo "Website:$name"
echo "Url: $url"
echo "Age: $age"
注意,必须在一行内输入所有的值,不能换行,否则只能给第一个变量赋值,后续变量都会赋值失败。

image-2.png

exit

  • 退出当前 Shell 进程,并返回一个退出状态;使用$?可以接收这个退出状态

  • exit 命令可以接受一个整数值作为参数,代表退出状态。如果不指定,默认状态值是 0。

  • exit 退出状态只能是一个介于 0~255 之间的整数,其中只有 0 表示成功,其它值都表示失败。

  • Shell 进程执行出错时,可以根据退出状态来判断具体出现了什么错误,比如打开一个文件时,我们可以指定 1 表示文件不存在,2 表示文件没有读取权限,3 表示文件类型不对。

#!/bin/bash
echo "befor exit"

exit 8

echo "after exit"

只会打印出 berfore exit,这说明遇到 exit 命令后,test.sh 执行就结束了。但是会提示 command not found 8 当我们通过$?去访问的时候

let

let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来。

语法

let arg [arg ...]
let sum=10+20
echo $sum
# 30

sum=10+20
echo $sum
# 10+20
# 自增
let num++
# 自减
let num--
# 加等和减等也可以
let num+=10
let num-=10

expr

expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。

语法:

expr 表达式

表达式说明

  • 用空格隔开每一项
  • 用反斜杠\放在shell特定字符前面
  • 对包含空格和其他特殊字符的字符串要用引号括起来
# 计算字串长度
expr length "this is a test"
# 14

# 抓取字符串
expr substr “this is a test” 3 5
# is is 从3开始 截取 5位

# 抓取第一个字符数字串出现的位置
expr index "sarasara"  a
# 2

# 整数运算
expr 14 % 9
# 5

expr 10 + 10
# 20

expr 1000 + 900
# 1900

expr 30 / 3 / 2
# 5

expr 30 \* 3 (使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义)
# 90

expr 30 * 3
# Syntax error 乘号需要转译一下

bc

bc 命令是任意精度计算器语言,通常在linux下当计算器用。
  • 加法 +
  • 减法 -
  • 乘法 *
  • 除法 /
  • 指数 ^
  • 取余 %

语法: bc(选项)(参数)

  • -i:强制进入交互式模式;
  • -l:定义使用的标准数学库
  • -v:显示指令版本信息;
  • -h:显示指令的帮助信息。
bc
进入到计算模式

quit退出

test

test命令用于检测某个条件是否成立

参数说明
-eq等于则为真
-ne不等于则为真
-gt大于则为真
-ge大于等于则为真
-lt小于则为真
le小于等于则为真

eg

num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

输入两个数相等 代码中的 [] 执行基本的算数运算

参数说明
=等于则为真
!=不等于则为真
-z 字符串字符串的长度为零则为真
-n 字符串字符串的长度不为零则为真
文件测试
-e 文件名如果文件存在则为真
-r 文件名如果文件存在且可读则为真
-w 文件名如果文件存在且可写则为真
-x 文件名如果文件存在且可执行则为真
-s 文件名如果文件存在且至少有一个字符则为真
-d 文件名如果文件存在且为目录则为真
-f 文件名如果文件存在且为普通文件则为真
-c 文件名如果文件存在且为字符型特殊文件则为真
-b 文件名如果文件存在且为块特殊文件则为真

逻辑运算

  • -a是并且的意思
  • -o是或的意思
  • !是 取反