Shell教程

UID

Shell 编程中,$UID 是一个全局变量用于表明当期的用户 ID,如果是 0 表明是 root 用户。

清空日志

Linux 中,清空日志有三种方式,第一种是使用 cat 命令,命令如下:

cat /dev/null > xxx.log

第二种是使用 echo 命令,命令如下:

echo "" > xxx.log

最后一种是使用重定向,命令如下:

> xxx.log

Shell分类

UNIX/LINUX 中主要有两大类 Shell,即:

  • Bourne shell(sh,ksh,bash)
  • C shell(csh,tcsh)

查看当前 shell,使用如下命令:

echo $SHELL

Shell编程

Shell 编程的第一行代码:

#!/bin/bash

放在第一行才管用,放在下面就是注释了,相应的语言的开头标识内容:

#!/bin/sh #!/bin/bash #!/usr/bin/awk #!/bin/sed #!/usr/bin/tcl #!/usr/bin/expect

如果脚本开头不指定解释器,那么,就要用对应的解释器来执行脚本,例如:

bash test.sh python test.py

Shell环境变量

当 shell 脚本以非交互方式运行时,它会先查找环境变量 ENV。该变量指定了一个环境文件(通常是 .bashrc),然后从该关键变量文件开始执行,当读取了 ENV 文件后,SHELL 才开始执行 shell 脚本中的内容。

Shell脚本执行

shell 脚本的执行通常可以采用以下三种方式:

bash script-name 或 sh script-name(推荐使用,在脚本没有执行权限时也通常这样用) path/script-name 或 ./script-name(当前路径下执行脚本) source script-name 或 . script-name

Shell变量

环境变量

如果在 shell 中定义了一个变量,用 “.” 执行 shell 这个变量会被传递到命令行:

命令 说明
env 或 set 显示环境变量
unset 取消环境变量

如果想设置环境变量,就要在给变量赋值之后或设置变量时使用 export 命令。带 -x 选项的 declare 内置命令也可以完成同样的功能。

输出变量

命令 说明
echo “$HOME” 输出 /home/haicoder
echo ‘$HOME’ 输出 $HOME

定义变量

定义变量有三种方式:

  1. 第一种定义变量的方式是直接定义变量内容,内容一般为简单连续的数字、字符串、路径名等。
  2. 第二种定义变量的方式是通过单引号定义变量,这个方式特点是:输出变量时引号里是什么就输出什么,即使内容中有变量也会把变量名原样输出,此方法适合定义显示纯字符串。
  3. 第三种定义变量的方式是通过双引号,这个方式特点是:输出变量时引号里的变量会经过解析后输出该变量内容。

脚本变量

脚本函数中的变量称为局部变量,要以 local 方式进行声明,使之只在本函数作用于有效,防止变量在函数中的命名与外部程序中变量重名造成程序异常。

shell特殊变量

位置变量

变量 说明
$0 获取当前执行的 shell 脚本的文件名,包括脚本路径
$n 获取当前执行的 shell 脚本的第 n 个参数值,当 n 为 0 时表示脚本的文件名
$* 获取 shell 的所有参数,将所有的命令行参数视为单个字符串,相当于 “$1$2$3”, 注意与 $# 区别
%# 获取当前 shell 命令行中参数的总个数
#@ 所有程序的所有参数 “$1” “$2” “$3” “$4”,这是将参数传递给其他程序最佳方式。因为他会保留内嵌在 每个参数的空白

进程状态变量

变量 说明
$$ 获取当前 shell 的进程号(PID)
$! 执行上一个指令的 PID
$? 获取执行上一个指令的返回值(0 为成功,非零为失败)
$_ 在此之前执行的命令或脚本的最后一个参数

{#string} 返回string的长度
{string:position} 在string中,从位置postion之后开始提取子串 {string:postion:length} 在string中,从位置postion之后开始提取长度为length的子串 {string#substring} 从变量string开头开始删除最短匹配substring子串
{string##substring} 从变量string开头开始删除最长匹配substring子串 {string%substring} 从变量string结尾开始删除最短匹配substring子串
{string%%substring} 从变量string结尾开始删除最长匹配substring子串 {string/substring/replace} 使用replace.来代替第一个匹配的substring,
{string/#substring/replace}如果string前缀匹配substrng.就用replace来代替来代替匹配substringsubstring {string/%substring/replace}如果string后缀匹配substring,就用replace来代替匹配substring

renmae .JPG .htm *.JPG #把当前目录下所有的JPG后缀的文件改成htm

变量替换

{value:-word} 如果变量名存在且非null,则返回变量的值。否则,返回word字符串 {value:=word} 如果变量名存在且非null,则返回变量的值。否则,设置这个变量值为word,并返回值
{value:? "not defined"} 如果变量名存在且非null,则返回变量的值。否则显示变量名:message,并推出当前的命令或脚本 {value:+word} 如果变量名存在且非null,则返回word,否则返回null

计算字符串长度的三种方法

{#chars} (效率最高) chars | wc -m
(exprlength"(expr length "chars")

变量的数值计算

n**m n的m次方
(()) 用于执行简单的整数运算,很常用,且效率高,只需要将特定的算术表达式用"$((“和”))"括起,不支持小数运算
let 赋值表达式 功能等同于 ((赋值表达式))
i=2
let i=i+8
echo $i #10
expr命令一般用于整数值,但也可以用于字符串,用来求表达式变量的值,同时expr也是一个手工命令行计算器
expr 2 + 3 #数字和运算符之间必须加空格
或者 expr $[2+4]

判断是否是整数的方法

read -p “Please input a number:” a
expr $a + 0 &>/dev/null
[ $? -eq 0 ] && echo int || echo chars

echo “scale=2; 5.23/3.13” | bc
echo “obase=2;8” | bc #把8转成2进制

read
-p 设置提示信息
-t 设置输入等待时间,单位为秒