几个常用的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