linux shell(上)

几个常用的shell命令

  • file 命令是一个方便的小工具,能够探测文件的内部并判断文件类型

    file .bashrc  # 检查文件
    file Document # 检查目录
    
  • df命令可以方便地查看所有已挂载磁盘的使用情况

  • du 命令可以显示某个特定目录(默认情况下是当前目录)的磁盘使用情况。

  • sort 命令会依据会话所指定的默认语言的排序规则来对文本文件中的数据行进行排序

    sort file1     # sort 命令会依据会话所指定的默认语言的排
                   # 序规则来对文本文件中的数据行进行排序
    sort -n file2  # sort 命令会将数字视为字符并执行标准的字符排序
                   # 可以使用-n 选项告诉 sort 命令将数字按值排序
    sort -M file3  # 常用选项-M,该选择可以将数字按月排序
    
  • find 查找文件

    find / -name file1  # 从 '/' 开始进入根文件系统搜索文件和目录
    find / -user user1  # 搜索属于用户 'user1' 的文件和目录
    find /home/user1 -name \*.bin     # 在目录 '/ home/user1' 中搜索带有'.bin' 结尾的文件
    find /usr/bin -type f -atime +100 # 搜索在过去100天内未被使用过的执行文件
    find /usr/bin -type f -mtime -10  # 搜索在10天内被创建或者修改过的文件
    find / -xdev -name \*.rpm         # 搜索以 '.rpm' 结尾的文件,忽略光驱、捷盘等可移动设备
    find / -name \*.rpm -exec chmod 755 '{}' \; # 搜索以 '.rpm' 结尾的文件并定义其权限
    

linux 环境变量

bash shell 使用环境变量来存储 shell 会话和工作环境的相关信息。环境变量允许在内存中存储数据,以便 shell 中运行的程序或脚本能够轻松访问到这些数据。这也是存储持久数据的一种简便方法。

全局环境变量

全局环境变量对于 shell 会话和所有生成的子 shell 都是可见的。

Linux 系统在你启动 bash 会话时就设置好了一些全局环境变量。系统环境变量基本上会使用全大写字母,以区别于用户自定义的环境变量。

# 可以使用 env 命令或 printenv 命令来查看全局变量
env 
printenv

要显示个别环境变量的值,可以使用 printenv 命令

# HOME变量表示当前用户的home绝对路径
printenv HOME
# 可以使用 echo 命令显示变量的值
echo $HOME  # 注意添加$符

局部环境变量

局部环境变量则只对创建它的 shell 可见。

set 命令可以显示特定进程的所有环境变量,既包括局部变量、全局变量,也包括用户自定义变量。

set

用户自定义变量

定义一个my_variable,并引用

my_variable="Hello World" # 变量名、等号和值之间没有空格
echo $my_variable

注意:等号两边不能有空格

字符串定义最好加上引号(养成习惯)。(如果没有引号,上例中会将World识别为命令)

退出shell后my_variable变量会被销毁,重新打开shell无法访问

设置全局变量

全局环境变量在设置该变量的父进程所创建的子进程中都是可见的。创建全局环境变量的方法是先创建局部变量,然后再将其导出(export)到全局环境中。

my_variable="I am Global now"
export my_variable
echo $my_variable

export my_var='ok' # 可以将设置变量和导出变量放在一个命令里完成

修改子 shell 中的全局环境变量并不会影响父 shell 中该变量的值

子 shell 甚至无法使用 export 命令改变父 shell 中全局环境变量的值

删除环境变量

可以用 unset 命令来完成这个操作。在 unset 命令中引用环境变量时,记住不要使用$。

my_variable="I am going to be removed"
echo $my_variable
unset my_variable

设置PATH环境变量

引用原来的 PATH 值,添加冒号(:),然后再使用绝对路径输入新目录即可

PATP=$PATH:/home/zx/Scripts

修改后的PATH只能在当前的shell中使用!

环境变量持久化

当你登录 Linux 系统启动 bash shell 时,默认情况下 bash 会在几个文件中查找命令。这些文件称作启动文件或环境文件。bash 进程的启动文件取决于你启动 bash shell 的方式。启动 bash shell有以下 3 种方式:

  • 登录时作为默认登录 shell;

  • 作为交互式 shell,通过生成子 shell 启动;

  • 作为运行脚本的非交互式 shell。

登录shell

登录 Linux 系统时,bash shell 会作为登录 shell 启动。登录 shell 通常会从 5 个不同的启动文件中读取命令。

  • /etc/profile

  • $HOME/.bash_profile

  • $HOME/.bashrc

  • $HOME/.bash_login

  • $HOME/.profile

/etc/profile 文件是系统中默认的 bash shell 的主启动文件。系统中的每个用户登录时都会执行
这个启动文件。

另外4个启动文件是针对用户的,位于用户主目录中,可根据个人具体需求定制。

交互式shell进程

如果不是在登录系统时启动的 bash shell(比如在命令行中输入 bash),那么这时的 shell 称作交互式 shell。

作为交互式 shell 启动的 bash 并不处理/etc/profile 文件,只检查用户$HOME 目录中的.bashrc文件。

非交互式shell

系统执行 shell 脚本时用的就是这种 shell,不同之处在于它没有命令行提示符。

持久化

对全局环境变量(Linux系统的所有用户都要用到的变量)来说,最好在/etc/profile.d目录中创建一个以.sh
结尾的文件,把所有新的或修改过的全局环境变量设置都放在这个文件中。

在大多数发行版中,保存个人用户永久性 bash shell 变量的最佳地点是$HOME/.bashrc 文件。

构建基础脚本

在创建shell脚本文件时,必须在文件的第一行指定要使用的shell,格式如下:

#!/bin/bash

在普通的shell脚本中,#用作注释行。shell并不会处理shell脚本中的注释行。然而,shell脚本文件的第一行是个例外,#后面的惊叹号会告诉shell用哪个shell来运行脚本。

可以通过 echo 命令添加自己的文本消息来告诉用户脚本正在做什么。

echo This is a test #  在默认情况下,无须使用引号将要显示的字符串划定出来

echo 命令可用单引号或双引号来划定字符串。如果在字符串中要用到某种引号,可以使用另一种引号来划定字符串。

echo "This is a test to see if you're paying attention" # 字符串中有引号

如果想把字符串和命令输出显示在同一行中,可以使用 echo 命令的-n 选项

echo -n "The time and date are: "

shell 变量

在脚本中,可以在环境变量名之前加上$来引用这些环境变量

#!/bin/bash
# display user information from the system.
echo "User info for userid: $USER" # echo 命令中的环境变量会在脚本运行时被替换成当前值
echo UID: $UID
echo HOME: $HOME

环境变量$USER、$UID 和$HOME 用来显示已登录用户的相关信息

自定义变量

shell 脚本还允许用户在脚本中定义和使用自己的变量。定义变量允许在脚本中临时存储并使用数据。

用户自定义变量的名称可以是任何由字母、数字或下划线组成的字符串,长度不能超过 20个字符。因为变量名区分大小写,所以变量 Var1 和变量 var1 是不同的。

使用等号为变量赋值。在变量、等号和值之间不能出现空格。

var1=10
var2=-57
var3=testing
var4="still more testing"
命令替换

shell 脚本中最有用的特性之一是可以从命令输出中提取信息并将其赋给变量。把输出赋给变量之后,就可以随意在脚本中使用了。

有两种方法可以将命令输出赋给变量:

  • 反引号(`)

  • $()格式

#!/bin/bash
test1=`date`
test2=$(date)
echo "The date and time are: " $test1
echo "The date and time are: " $test2

重定向输入和输出

输出

有时候,想要保存命令的输出而不只是在屏幕上显示。bash shell 提供了几个运算符,它们可以将命令的输出重定向到其他位置(比如文件)。

最基本的重定向会将命令的输出发送至文件。bash shell 使用大于号(>)来实现该操作

command > outputfile

如果输出文件已存在,则重定向运算符会用新数据覆盖已有的文件

命令输出追加到已有文件中,可以用双大于号(>>)来实现

date >> test6
输入

输入重定向和输出重定向正好相反,输入重定向会将文件的内容重定向至命令。输入重定向运算符是小于号(<):

command < outputfile
wc < test6

wc 命令可以统计数据中的文本,在默认情况下,它会输出 3 个值

  • 文本的行数

  • 文本的单词数

  • 文本的字节数

还有另外一种输入重定向的方法,称为内联输入重定向(inline input redirection)。这种方法无须使用文件进行重定向,只需在命令行中指定用于输入重定向的数据即可。

command << marker

管道

将一个命令的输出作为另一个命令的输入,这可以通过重定向来实现,只是略显笨拙。无须将命令输出重定向至文件,可以将其直接传给另一个命令。这个过程称为管道连接(piping)。

# command1 | command2  # 格式
rpm -qa | sort
rpm -qa | sort | more

数学运算

expr命令

Bourne shell 提供了一个专门用于处理数学表达式的命令:expr,该命令可在命令行中执行数学运算,但是特别笨拙。

expr 1 + 5
expr 5 \* 2 # 注意转义字符
#!/bin/bash
# An example of using the expr commandvar1=10
var2=20
var3=$(expr $var2 / $var1)
echo The result is $var3
使用方括号

在 bash 中,要将数学运算结果赋给变量,可以使用$和方括号($[ operation ]):

var1=$[1 + 5]
echo $var1
var2=$[$var1 * 2]
echo $var2

退出脚本

Linux 提供了专门的变量$?来保存最后一个已执行命令的退出状态码。对于需要进行检查的命令,必须在其运行完毕后立刻查看或使用$?变量。

echo $?

对于成功结束的命令,其退出状态码是 0。对于因错误而结束的命令,其退出状态码是一个正整数:

状态码 描述
0 命令成功结束
1 一般性未知错误
2 不适合的 shell 命令
126 命令无法执行
127 没找到命令
128 无效的退出参数
128+x 与 Linux 信号 x 相关的严重错误
130 通过 Ctrl+C 终止的命令
255 正常范围之外的退出状态码

exit 命令允许在脚本结束时指定一个退出状态码:

#!/bin/bash
# testing the exit status
var1=10
var2=30
var3=$[ $var1 + $var2 ]
echo The answer is $var3
exit 5

相关推荐

  1. LinuxShell编程中source和export命令

    2024-07-20 17:18:04       36 阅读
  2. list<span style='color:red;'>上</span>

    list

    2024-07-20 17:18:04      58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 17:18:04       141 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 17:18:04       155 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 17:18:04       129 阅读
  4. Python语言-面向对象

    2024-07-20 17:18:04       141 阅读

热门阅读

  1. RK3588 编译opencv&opencv_contrib记录

    2024-07-20 17:18:04       38 阅读
  2. 二叉树---路径总和

    2024-07-20 17:18:04       29 阅读
  3. windows 安装 kubectl 并连接到 k8s 集群【图文教程】

    2024-07-20 17:18:04       29 阅读
  4. computeIfAbsent 和 putIfAbsent

    2024-07-20 17:18:04       30 阅读
  5. 微软Edge浏览器全解析教程

    2024-07-20 17:18:04       29 阅读
  6. 如何使用unittest框架来编写和运行单元测试

    2024-07-20 17:18:04       29 阅读
  7. 数学建模熵权法

    2024-07-20 17:18:04       34 阅读
  8. RabbitMQ线程和连接模型详解

    2024-07-20 17:18:04       32 阅读
  9. 探索现代Web开发:WebKit的剪贴板API革新

    2024-07-20 17:18:04       43 阅读